<div class="containter" id="ControlGroupDiv">
<input onbeforeupdate="alert('bingo 0'); return false;" onclick="alert('click 0');return false;" id="Radio1" type="radio" value="0" name="test" checked="checked" />
<input onbeforeupdate="alert('bingo 1'); return false;" onclick="alert('click 1');return false;" id="Radio2" type="radio" value="1" name="test" />
<input onbeforeupdate="alert('bingo 2'); return false;" onclick="alert('click 2');return false;" id="Radio3" type="radio" value="2" name="test" />
<input onbeforeupdate="alert('bingo 3'); return false;" onclick="alert('click 3');return false;" id="Radio4" type="radio" value="3" name="test" />
<input onbeforeupdate="alert('bingo 4'); return false;" onclick="alert('click 4');return false;" id="Radio5" type="radio" value="4" name="test" />
<input onbeforeupdate="alert('bingo 5'); return false;" onclick="alert('click 5');return false;" id="Radio6" type="radio" value="5" name="test" />
</div>
在FireFox 2和3上,在单选按钮的点击事件中放置return false
会阻止它以及组中所有其他单选按钮的值发生更改。这实际上使其只读,而不是禁用并使其变灰。
在Internet Explorer上,如果另一个单选按钮被选中,而您点击组中的其他单选按钮,则在单击所单击的按钮之前,选中的按钮会清除。但是,由于单击事件中的'return false',所单击的那个按钮不会被选择。
根据MSDN的说法,onbeforeupdate
事件会在单击事件触发之前对控件组中的所有控件进行触发,并且我认为那是其他单选按钮被清除的地方。但是,如果您尝试上面的代码,则永远不会从onbeforeupdate
事件中显示任何警报-您只会得到单击事件的警报。显然,该事件从未被触发或者没有一种方法可以捕获它。
有没有一种事件可以捕获,以防止组中的其他单选按钮被清除?
请注意,这只是一个简化的示例,实际上我们正在使用jQuery设置事件处理程序并进行处理。
更新:
如果您将此事件添加到其中一个单选按钮中:
onmousedown="alert('omd'); return false;"
警告框弹出,你关闭它,但是点击事件从未触发。所以我们认为已经解决了问题,但是事实证明并不是那么简单。如果你删除警告框并将其更改为以下内容:
onmousedown="return false;"
它不起作用。其他的单选按钮会清除,然后单击事件会触发。但onbeforeupdate
仍然没有触发。
我们认为这可能是时间问题(尽管很少是真的),所以我尝试了这个:
onmousedown="for (i=0; i<100000; i++) {;}; return false;"
你点击后,它会暂停一段时间,然后另一个单选按钮清除,接着点击事件触发。啊啊啊!更新:Internet Explorer很糟糕。除非有人提出好的想法,否则我们将放弃这种方法,并采用复选框jQuery扩展,它确实可以做到我们想要的,但会给页面带来更重的客户端脚本负担,并且需要由于ASP.Net服务器控件渲染和主页名称混淆而进行更多的HTML重新编码。