我试图理解为什么未触发以下示例中的更改事件(我将准确显示其中的位置)。
我有一个复选框,让我们调用它' mainCheckbox',如果选中 - 我想检查一些其他相关的复选框(到目前为止工作)。
此外,当我取消选中其中一个相关复选框(子复选框)时 - 我想取消选中mainChecbox,这也有效 - 但这是我无法理解的内容:
我正在更改mainCheckbox的checked属性(在' childCheckbox'的onchange处理程序中),
为什么不调用mainCheckbox的onchange处理程序?
或者为什么没有触发主复选框的onchange事件?
这是代码:
//binding to the 'mainCheckbox' change event:
$("[data-role='group']").bind("change", function(event){
//checking / unchecking all related checkboxes respectivly
$("li input[data-group='" + event.target.id + "'").prop('checked', $(this).prop("checked"));
})
//binding to the change event of every 'child checkbox'
$("li input[data-group]").bind("change", function(){
if (event.target.checked){
//if the child checkbox is now checked - I am checking if now all child checkboxes are checked,
//if so - I need to check the main checkbox.
if ($("[data-group=" + event.target.dataset.group + "]:checked").length == $("[data-group=" + event.target.dataset.group + "]").length){
$("#" + event.target.dataset.group).prop("checked", true);
}
//TODO: add this device to the selectedDevices array.
}
else {
//the checkbox is now unchecked - so I am unchecking the main checkbox -
//but here is my failing to understand part: I am unchecking the main checkbox -
//why the change event is not triggered? I thought that now all child checkboxes will be unchecked as well
//(I am happy they are not :) just failing to understand why)...
$("#" + event.target.dataset.group).prop("checked", false);
//TODO: remove this device from the selectedDevices array.
}
})
事先感谢所有响应者,
麦
答案 0 :(得分:2)
通常,事件仅在响应用户操作而不是代码中的操作时触发。在复选框上设置checked
属性不会触发其change
事件; 用户更改复选框的已检查状态。
当您使用代码设置value
的{{1}},input
的{{1}}(或selectedIndex
}时,也是如此等
与value
元素上的select
事件相关也是如此:调用submit
form
函数将提交表单没有触发其HTMLFormElement
事件。 但是,如果您使用jQuery提交表单(例如,如果您在围绕submit
的jQuery对象上调用submit
),则会触发其submit
事件处理程序。这是jQuery API设计的不幸副产品。
如果你想触发一个事件,你可以使用jQuery的trigger
功能。因此,如果它合适,在设置HTMLFormElement
之后,您可以submit
。一般来说,我提倡不生成这样的合成预定义事件(相反,只需调用您需要调用的任何函数,或者使用合成自定义事件),但是有一些有效的用例。
答案 1 :(得分:1)
当元素失去焦点时会触发Onchange事件。由于您以编程方式更改值,因此您正在更改的元素永远不会失去焦点。您可以查看oninput
事件。