0

我想暂时禁用与 jstree 和 Backbone.View.delegateEvents() 绑定的 JQuery 元素上的单击事件。

以下是我的处理方式

在禁用事件之前,我使用将事件记录在局部变量中

self.defaultClick = $(this).data('events').click[0];

之后,我使用禁用点击事件

$(this).click(false);

现在我需要再次绑定,我将它分配回元素使用

$(this).data('events').click = self.defaultClick;

效果很好,直到第二次。

我从 JQuery.event.add 'Object # has no method 'push'' 在这一行得到这个错误

handlers.push( handleObj );

问题是“处理程序”在第二次分配后成为事件本身,而在第一次分配时它是一个数组。

任何想法,我该如何解决?通过在确定事件已经绑定后避免重新分配事件,或者可能正在使用其他方式分配事件?

感谢您的帮助。

编辑

我在这个应用程序上使用 jstree。我在 css 类上绑定了特定事件,但是,关于应用程序的状态,我需要能够禁用所有树(包括之前绑定的类)。

4

2 回答 2

1

你为什么不只维护一些 var 来控制事件是否会被执行?有点像:

var runEventFor = {};

runEventFor[ "myComponent" ] = true;
$( "#myComponent" ).click(function(evt){
    if ( runEventFor[ $(this).attr("id") ] ) {
        // code to run...
    }
});

当您不想执行事件时,只需设置runEventFor[ "myComponent" ]为 false。我认为在您的情况下,这种方法比绑定/取消绑定事件更简单。

于 2012-08-06T03:35:52.993 回答
1

绑定/取消绑定处理程序很昂贵;为什么不直接使用委托事件处理程序,设置为针对特定类名(例如.executeState)运行——然后您可以通过切换类来控制是否运行代码:$(element).toggleClass('executeState');

这样,只有一个处理程序绑定到document(或您要定位的元素的任何父元素),只有一次。

$(document).on('click', '.executeState', function() {
    // handler for click event
});
于 2012-08-06T03:39:28.870 回答