考虑以下代码(http://jsfiddle.net/FW36F/1/):
<input type="checkbox" onchange="alert(this.checked)">
<button onclick="document.getElementsByTagName('input')[0].checked=!document.getElementsByTagName('input')[0].checked;">toggle</button>
如果您单击复选框,您会收到一条警报,告诉您它是否已被选中。伟大的。但是,如果单击切换按钮,复选框会更改为选中状态,但不会触发 onchange 事件。
本质上,复选框的 onchange 仅在用户实际单击复选框时触发,而不是在通过 JavaScript 更改复选框时触发。在 IE、FF 和 Chrome 中都是如此。看来这种行为也符合规范。
但是,如果由于某种原因复选框的选中状态发生更改,我真的需要某种事件来触发。这可能吗?
哦,是的,而且jQuery 是不允许的。请不要使用基于 setTimeout/setInterval 的解决方案...
更新:另外,我应该明确一点,上面的代码仅用于说明。在实际代码中,我们需要确保复选框的状态是选中或未选中——而不仅仅是切换它。也许这将是更好的代码来说明:
<input type="checkbox" onchange="alert(this.checked)">
<button onclick="document.getElementsByTagName('input')[0].checked=true;">check</button>
<button onclick="document.getElementsByTagName('input')[0].checked=false;">un check</button>
此外,在我们无法完全控制的其他区域中可能存在代码,这可能会执行简单的 .checked=true/false —— 我们希望确保我们也能看到这一点。