禁用时,嵌套更改事件仍会发生

Nested change event still happens when disabled

本文关键字:事件 嵌套      更新时间:2023-09-26

我希望categorycb_change函数在进行时不执行permissioncb_change,但它不起作用。

在下面的代码中,我将fireCategoryEvents设置为 false 何时执行permissioncb_change,但是由于某种原因,这不会阻止category_cb执行。当我调试时,我可以看到permissioncb_change首先完成,并且只有在完成执行时才会触发categorycb_change

(重要说明:categorycb_changepermissioncb_change函数内updateGroupCheckboxes触发。

我也尝试了取消绑定和重新绑定,但同样的问题。

做错了什么,或者我该如何解决这个问题?

.permissioncheckbox.rolecategory 都是 HTML 输入复选框元素。updateGroupCheckboxes背后的代码非常复杂。所以我认为在这里展示没有用。(它更改多个.rolecategory复选框的检查状态,因此它会触发categorycb_change事件(

var fireCategoryEvents = true;
$(function () {
    $('.permissioncheckbox').change(permissioncb_change, 0);
    $('.rolecategory').change(categorycb_change);
});
function permissioncb_change() {
    fireCategoryEvents = false;
    $(this).attr('data-changed', true);
    if (firePermissionEvents) {
        updateGroupCheckboxes(this);
    }
    fireCategoryEvents = true;
}
function categorycb_change() {
    if (fireCategoryEvents) {
        alert('cat changed');
    }
}

我找到了解决方案:

function permissioncb_change() {
    $(this).attr('data-changed', true);
    if (arguments[0].originalEvent.srcElement.className != 'rolecategory') {
        updateGroupCheckboxes(this);
        alert('per changed');
    }
}
function categorycb_change() {
    if (arguments[0].originalEvent.srcElement.className != 'permissioncheckbox') {
        alert('cat changed');
    }
}

这样,我在决定运行代码之前检查事件的起源。