我想暂时禁用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类上绑定了特定事件,但是,关于应用程序的状态,我需要能够禁用所有树(包括之前绑定的类)。
答案 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
});