注意: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);
答案 0 :(得分:4)
这是正确的,以编程方式更改输入的值或检查状态不会触发事件处理程序。
你必须使用javascript
触发事件document.getElementById('myCheckBox').addEventListener('change',function() {
console.log('Changed!');
});
document.getElementById('someLink').onclick = function() {
var box = document.getElementById('myCheckBox')
box.checked = !box.checked;
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
box.dispatchEvent(evt);
} else {
box.fireEvent("onchange");
}
};
并注意到onclick
(全部小写)
修改强>
我希望避免为每个链接添加复杂性来检查此框 理想情况下......我根本不想改变链接/点击逻辑。
我希望能够在代码中的任何位置更改.checked属性,并在每次更改时检测它而无需额外的逻辑(如果可能)。
如果不使用间隔等可怕的黑客攻击,这是不可能的。 当以编程方式更改检查状态时,事件处理程序根本不会被触发,因为在大多数情况下这确实是一个很大的问题,并且更难以解决相反的情况,您只需手动触发事件处理程序,这确实是唯一的方法。
当然,使用类和外部函数等可以使它更加方便
document.getElementById('myCheckBox').addEventListener('change',function() {
console.log('Changed!');
});
var links = document.querySelectorAll('.someLinkClass');
for (var i = links.length; i--;) {
links[i].addEventListener('click', triggerChange, false);
}
function triggerChange() {
var box = document.getElementById('myCheckBox')
box.checked = !box.checked;
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
box.dispatchEvent(evt);
} else {
box.fireEvent("onchange");
}
};
随时添加链接,只需添加该类
即可<a href="#" class="someLinkClass">Change the checkbox</a>
<a href="#" class="someLinkClass">Change the checkbox again</a>
<a href="#" class="someLinkClass">Change the checkbox even more</a>
等
答案 1 :(得分:1)
getElementByClass('classname')
<div onclick="doSomething()"></div>
只需使用if / else语句进行检查/取消选中:
if(document.getElementById('myCheck').checked){document.getElementById("myCheck").checked = false;} else{document.getElementById("myCheck").checked = true;}
答案 2 :(得分:0)
你可以调用/触发一个事件,但它并不像看起来那么容易,特别是当你必须处理Internet Explorer时。
最干净的解决方案是将您的事件放入自己的函数中,然后在需要的地方调用它。
function handleEvent(){
console.log('Changed!');
}
documentent.getElementById('myCheckBox').addEventListener('change',function() {
handleEvent()
});
document.getElementById('someLink').onClick = function() {
// toggle checkbox
document.getElementById('myCheckBox').checked = !document.getElementById('myCheckBox').checked;
handleEvent();
};
答案 3 :(得分:0)
我认为jQuery有一个改变事件。并且你没有以良好的方式使用它。
阅读本页:http://api.jquery.com/change/
并且:jQuery checkbox change and click event
当复选框中发生任何更改时,将调用jQuery事件函数。然后你可以在这个事件函数中写任何东西