我想检测复选框状态的变化,但当我尝试使用 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时,change事件没有被触发。我可以为#myLink添加另一个监听器,但如果我添加其他链接来检查相同的框,则必须添加更多监听器。我想要一个复选框change事件的监听器。再次强调,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);
<div class="class1 class2"></div>
- Mike K