检测单选按钮/复选框状态的更改

5
我需要可靠地检测页面上单选按钮/复选框的状态更改,以观察表单是否已被修改。现在,这是一个完全独立的脚本,我不能修改任何控制表单的内容。
目前,我只能看到两种方法:
- onchange事件处理程序,它可以帮助文本框、文本区和下拉列表,但不适用于复选框/单选按钮。 - onclick事件处理程序,不可靠,因为用户经常使用快捷键来更改这些元素的值。
我错过了什么?有没有一种可靠的方法来检测复选框的选中状态?
更新:正如你们指出的那样,改变事件确实会在复选框/单选按钮上触发,尽管w3schools说它仅适用于文本输入。
然而,我的问题在于复选框/单选按钮的值是通过setAttribute在脚本中设置的,在这种情况下,事件不会被触发。
在这种情况下我能做些什么吗?

1
复选框和单选按钮确实会触发onchange事件,问题在于IE只有在复选框或单选按钮失去焦点后才会触发该事件。 - mu is too short
2个回答

2
请看:http://www.quirksmode.org/dom/events/change.html。 主流浏览器都支持change事件,但IE的实现有缺陷。 引用部分如下: 当复选框或单选按钮失焦时,IE会触发该事件,而非在激活时触发。这是一个严重的错误,需要用户执行另一个动作,并阻止了基于复选框和单选按钮的change事件的一致跨浏览器界面。 我认为您可以通过这个技巧来解决IE的问题。在获得焦点时模糊元素!(在jQuery中使用类似$('input[type=radio]').focus(function(){$(this).blur();}); 的方法,或使用纯JavaScript)。

这个模糊事件不会触发两次吗? - Alex
5
IE 的行为并非一个 bug,而是符合 W3C HTML 规范。修复方法是对于单选框和复选框使用 click 事件,因为在它们改变状态时会触发 click 事件。 - RobG

0

好的,经过一番调查,我找到了一些信息。请注意,这仅适用于Firefox,也许只适用于Firefox。由于在这种情况下我正在处理内部应用程序,因此这对我已经足够。

所以,基本上,为了能够可靠地检测Firefox中复选框/单选按钮状态的更改,需要执行两个操作:

  1. 为复选框和单选按钮分别设置自定义Firefox事件处理程序CheckboxStateChange and RadioStateChange。当用户更改输入或通过脚本使用setAttribute修改时,将触发这些事件,但是,当通过这些元素的checkedselected属性在脚本中更改状态时,这些事件不会被触发,这就是我们需要...
  2. 使用Object.watch观察checked属性的更改

标准的onchange事件不好用,因为它仅在用户直接更改值时才触发。

该死,这个东西坏了...

如果有人感兴趣,我会发布一些代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接