.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,最后判断出用户选择的是哪个项目。具体的代码如下(借用一下别人的代码)
3
Q:为什么通常的办法不行了呢?
A:为什么通常的方法不行了呢?原因就出在嵌套上面,尤其是在用到masterpage的页面中,获取radiobuttonlist在客户端的name值就变得非常的不容易了
4
Q:如何来解决
A:上面说明了问题,最后说说怎么来解决吧,解决的方法一共有三种(我找到的,可能还有我没有找到的更好的方法)
a)通过手动替换ID值来获得Name值
这个方法的意思就是还是和以前一样通过ClientID来获取控件的ID,然后对ID值进行一下加工处理就可以得到Name值了,具体的方法如下
上面的代码显示的是一个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的编译错误(不是后台的编译错误,不影响运行),不过这个方法确实是一个聪明的方法。下面就贴出来具体的代码
嘿嘿,看到上面代码的不同了吗?对,就是在listitem中添加onclick客户端事件,这样每次onclick都可以确定哪个项目被选了,嘿嘿,我真的觉得这个方法很好玩。
不过这个方法也存在问题,问题就在于当你用数据绑定项目的时候会出现问题,主要不好控制onclick的内容。
上面3个方法是我今天找到的,写到这里的时候我又搜索到了一种方法,感觉也很好,贴出来大家看看
总之这个问题还是不难的,不过自己想想一个取值就这么多种方法,还真的挺好玩的,嘿嘿。
好了,今天到这里了,这两天遇到的问题也都差不多说出来了,希望可以帮助到以后遇到这些问题的人,嘿嘿
下面就说说我遇到的情况
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>
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>
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
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 阅读(3168) 评论(6) 编辑 收藏 举报