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

时间:2013-07-18 06:22:48

标签: javascript events

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

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

(重要提示:categorycb_changeupdateGroupCheckboxes功能中permissioncb_change内触发。

我也尝试过解绑和重新绑定,但同样的问题。

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

.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');
    }
}

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

1 个答案:

答案 0 :(得分:0)

我用问题的解决方案更新了问题。