我正在尝试找到一种简单的方法来禁用 DOM 元素的所有 jQuery 事件处理程序,例如hover
,click
等。我知道我可以使用unbind
来做到这一点。但它需要一段代码来做到这一点。我只想知道是否有任何 jQuery 开关来控制它?另外,我知道有一个使用全局变量的解决方案。我认为编写这样的硬代码并不好。
//in some event handler
if (sometag)
{
//do something.
}
代码并不优雅。有什么想法或我不知道的事情吗?
我正在尝试找到一种简单的方法来禁用 DOM 元素的所有 jQuery 事件处理程序,例如hover
,click
等。我知道我可以使用unbind
来做到这一点。但它需要一段代码来做到这一点。我只想知道是否有任何 jQuery 开关来控制它?另外,我知道有一个使用全局变量的解决方案。我认为编写这样的硬代码并不好。
//in some event handler
if (sometag)
{
//do something.
}
代码并不优雅。有什么想法或我不知道的事情吗?
如果您只是在谈论您自己的处理程序,并且您希望为它们设置一个全局“开/关”开关,那么拥有一个您的处理程序测试的中心变量是一种完全合理的方法,既不错也不错。(我实际上不会让它成为一个全局变量,只是一个所有处理程序都可以访问的变量。)
或者,您可以命名您的事件:
$("some selector").bind("click.myevents", handler);
$("some selector").bind("hover.myevents", handler);
// ...
...并将名称空间用于unbind
所有这些:
$("*").unbind(".myevents");
...但是没有简单的方法可以重新打开它们,而且开销似乎有点高。
你的问题非常广泛和笼统。如果你能说出你的精确用例,有人可能会给你一个更好的答案。
在 dom 节点上激活/停用事件处理程序的另一种模式是将事件处理委托给父节点,并使用类来打开和关闭处理程序。
什么是事件委托?你会在这里找到一个简单的答案。
这是一个例子:
//HTML code :
<ul id="myList">
<li>
<input class="cbActivate" type="checkbox" /> <a href="#" class="link">first item</a>
</li>
<li>
<input class="cbActivate" type="checkbox" /> <a href="#" class="link">second item</a>
</li>
<li>
<input class="cbActivate" type="checkbox" /> <a href="#" class="link">third item</a>
</li>
</ul>
//javascript
$('.cbActivate').on('click', function () {
$(this).closest('li').find('a.link').toggleClass('active');
});
// handling clicks on 'a.active' links is delegated to the parent '#myList' node
$('#myList').on('click', 'a.active', function () {
alert("I'm an activated item !");
});
这是对应的jsfiddle
如果您真的想取消绑定所有事件处理程序,您可以使用.off()
不带任何参数:
$('p').off();
作为替代方案,您可以使用命名空间事件,这将允许您取消绑定命名空间的所有处理程序:
$('p').on('click.ns', handler).on('mouseover.ns', handler2).on('mouseout.otherns', handler3);
$('p').off('.ns'); //only the first two handlers are unbound