duohahawuwu~问题的价值

导航

.Net的MasterPage中的radiobuttonlist控件的javascript客户端取值

如何在客户端取到服务器控件的ID呢,这个问题很久很久以前的古老程序要就说明了这个问题了,在如今的AJAX应用中我们也通过之前的这种解决办法解决了需要的问题,一个小小的ClientID搞定所有(我的第一篇Blog文件中有说明),无论控件是在自定义控件中还是在MasterPage中都可以通过ClientID轻松的获取到控件的ID。但是今天我却遇到了另外一个问题,上面的方法突然在radiobuttonlist这个控件中不能应用了。
下面就说说我遇到的情况
1
Q:问题出在哪里,为什么会这样
A:以前获取控件的值都是通过documeng.getElementById+ID来得到的,但是radiobuttonlist控件比较特殊,他的每一个项目都会存在不同的ID,而每个项目之间的关系是通过groupname来决定的,也就是说同一个groupname下的radio可以进行相互的互斥选择。问题出要出现在互斥上面。

2
Q:通常情况怎么解决
A:通常的情况我们是通过documeng.getElementByName来获取的radiobuttonlist的groupname然后再用循环判断哪一个项目被checked,最后判断出用户选择的是哪个项目。具体的代码如下(借用一下别人的代码)
 1<script language="javascript">     
 2function getRadio()   
 3{   
 4    var   opts   =   document.all("RadioButtonList1");
 5    if   (opts)   
 6    {   
 7        for   (var   i   =   0;   i   <   opts.length;   i++)   
 8        {   
 9            if   (opts[i].checked)   
10            {   
11                alert(i);   
12                break;   
13            }
   
14        }
   
15    }
   
16}
   
17</script>

3
Q:为什么通常的办法不行了呢?
A:为什么通常的方法不行了呢?原因就出在嵌套上面,尤其是在用到masterpage的页面中,获取radiobuttonlist在客户端的name值就变得非常的不容易了

4
Q:如何来解决
A:上面说明了问题,最后说说怎么来解决吧,解决的方法一共有三种(我找到的,可能还有我没有找到的更好的方法)
a)通过手动替换ID值来获得Name值
这个方法的意思就是还是和以前一样通过ClientID来获取控件的ID,然后对ID值进行一下加工处理就可以得到Name值了,具体的方法如下
<span id="ctl00_ContentPlaceHolder1_RadioButtonList1"><input id="ctl00_ContentPlaceHolder1_RadioButtonList1_0" type="radio" name="ctl00$ContentPlaceHolder1$RadioButtonList1" value="1" /><label for="ctl00_ContentPlaceHolder1_RadioButtonList1_0">1</label><input id="ctl00_ContentPlaceHolder1_RadioButtonList1_1" type="radio" name="ctl00$ContentPlaceHolder1$RadioButtonList1" value="2" /><label for="ctl00_ContentPlaceHolder1_RadioButtonList1_1">2</label></span>

上面的代码显示的是一个radiobuttonlist生成HTML的源文件,可以看出来id和name是那么的相似,一个是ctl00_ContentPlaceHolder1_RadioButtonList1一个是ctl00$ContentPlaceHolder1$RadioButtonList1,区别就在于一个是用_来组合一个使用$来组合,所以我们获得ID以后用一下replace就可以轻松的获取到相应的Name值。得到了Name值就可以通过上面的传统方法来获取你想知道的内容了,嘿嘿
但是这个方法也存在一个问题,就是你的控件名称不能包含有_符号,如果存在的话这个方法反而会带来麻烦

b)通过radiobuttonlist中的项目ID来获取相应的值
这个方法比较简单了,继续观察上面的HTML源文件,可以看出来radiobuttonlist的每个项目的命名都是有规律的,第一项的ID结尾时0,第二项的ID结尾时1,以此类推,至于之前的名字就是控件的ClientID,这样你也可以通过循环来得到哪个项目被选中了

C)最后一个方法在我来看是一种比较好玩的办法,不过可能一般人还是不太容易接受的,因为这个方法会产生HTML的编译错误(不是后台的编译错误,不影响运行),不过这个方法确实是一个聪明的方法。下面就贴出来具体的代码
1<asp:radiobuttonlist id="RadioButtonList1" runat="server" repeatdirection="Horizontal" repeatlayout="Flow">
2            <asp:listitem value="1" onclick="setvalue('1')">1</asp:listitem>
3            <asp:listitem value="2" onclick="setvalue('1')">2</asp:listitem>
4        </asp:radiobuttonlist>

嘿嘿,看到上面代码的不同了吗?对,就是在listitem中添加onclick客户端事件,这样每次onclick都可以确定哪个项目被选了,嘿嘿,我真的觉得这个方法很好玩。
不过这个方法也存在问题,问题就在于当你用数据绑定项目的时候会出现问题,主要不好控制onclick的内容。

上面3个方法是我今天找到的,写到这里的时候我又搜索到了一种方法,感觉也很好,贴出来大家看看
 1 function togglePannelStatus(content)
 2    {
 3        var ListControl = document.getElementById( "<%=RdoLstYear.ClientID%>" ) ;
 4        var options = ListControl.getElementsByTagName( 'label' ) ;
 5        for( i=0 ; i < options.length ; i++ )
 6        {
 7              options[ i ].innerText = '2004' ;
 8        }

 9}

10

总之这个问题还是不难的,不过自己想想一个取值就这么多种方法,还真的挺好玩的,嘿嘿。

好了,今天到这里了,这两天遇到的问题也都差不多说出来了,希望可以帮助到以后遇到这些问题的人,嘿嘿

posted on 2008-06-24 23:33  duohahawuwu  阅读(3164)  评论(6编辑  收藏  举报