【发布时间】:2014-09-24 19:58:53
【问题描述】:
注意:jQuery 不是一个选项。
我想检测复选框状态的变化,但执行此操作时似乎不会触发 onChange 事件:
document.getElementById('myCheckBox').addEventListener('change',function() {
console.log('Changed!');
});
document.getElementById('someLink').onClick = function() {
// toggle checkbox
document.getElementById('myCheckBox').checked = !document.getElementById('myCheckBox').checked;
};
当我单击#someLink 时,不会触发更改事件。我可以向#myLink 添加另一个侦听器,但是如果我添加选中同一框的其他链接,我必须添加更多侦听器。我想要一个复选框更改事件的侦听器。同样,jQuery 不是一个选项,我需要 vanilla JS。
编辑:对不起,如果我没有更清楚地说明这一点,但我想避免为每个要选中此框的链接增加复杂性。所以理想情况下(也许答案是这是不可能的)我根本不想改变链接/点击逻辑。我希望能够在代码中的任何位置更改 .checked 属性,并在每次更改时无需附加逻辑即可检测到它(如果可能的话)。
更新:
好吧,如果不改变 onClick 逻辑,显然没有办法很好地做到这一点,所以(就像某种动物一样)我最终暴力破解了这个问题,如下所示:
function mySentinel() {
if(document.getElementById('myCheckBox').checked) {
console.log("I've been checked!");
return;
}
setTimeout("mySentinel()",100);
}
// then call this somewhere in the on document load section...
mySentinel();
如果需要,您也可以添加某种超时:
function mySentinel(var i) {
if(document.getElementById('myCheckBox').checked) {
console.log("I've been checked!");
return;
}
if(i <= 0) {
console.log("Time out. Still not checked");
}
i--;
setTimeout("mySentinel("+i+")",100);
}
// then call this somewhere in the on document load section...
// 60 second timeout (some math can make the argument look nicer)
mySentinel(600);
【问题讨论】:
标签: javascript html checkbox