我希望该categorycb_change
功能在进行permissioncb_change
中时不执行,但它不起作用。
在下面的代码中,我设置为何时fireCategoryEvents
执行,但是由于某种原因,这并不能阻止执行。当我调试时,我可以看到它首先完成,只有当它完成执行时才会触发。false
permissioncb_change
category_cb
permissioncb_change
categorycb_change
(重要提示:在函数内categorycb_change
触发。)updateGroupCheckboxes
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');
}
}
这样我在决定运行代码之前检查事件的起源是什么。