如果更改源不是来自html,则不会触发javascript事件?

时间:2016-07-30 07:28:41

标签: javascript jquery javascript-events


我试图理解为什么未触发以下示例中的更改事件(我将准确显示其中的位置)。

我有一个复选框,让我们调用它' 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.

    }

})

事先感谢所有响应者,

2 个答案:

答案 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事件。