之前已禁用的Jquery绑定事件

时间:2012-08-06 03:29:53

标签: jquery events backbone.js add handlers

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

以下是我处理的方式

在禁用事件之前,我使用

将事件记录在局部变量中
self.defaultClick = $(this).data('events').click[0];

之后,我使用

禁用了click事件
$(this).click(false);

现在我需要再次绑定,我使用

将其分配回元素
$(this).data('events').click = self.defaultClick;

这很好,直到第二次。

我从JQuery.event.add收到此错误'对象#在此行没有方法'push''

handlers.push( handleObj );

问题是'handlers'在第二次赋值后成为事件本身,而在第一次赋值时它是一个数组。

任何想法,我怎么能绕过? 要么在确定事件已经绑定之后避免重新分配事件,要么可能正在使用其他方式来分配事件?

感谢您的帮助。

修改

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

2 个答案:

答案 0 :(得分:1)

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

var runEventFor = {};

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

如果您不想执行该事件,只需将runEventFor[ "myComponent" ]设置为false即可。我认为在你的情况下,这种方法比bind / unbind事件更简单。

答案 1 :(得分:1)

绑定/解除绑定处理程序是昂贵的;为什么不只是使用委托的事件处理程序,设置为特定的类名运行(例如.executeState) - 然后你可以通过切换类来控制是否运行代码:$(element).toggleClass('executeState'); < / p>

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

$(document).on('click', '.executeState', function() {
    // handler for click event
});