0

我正在尝试找到一种简单的方法来禁用 DOM 元素的所有 jQuery 事件处理程序,例如hover,click等。我知道我可以使用unbind来做到这一点。但它需要一段代码来做到这一点。我只想知道是否有任何 jQuery 开关来控制它?另外,我知道有一个使用全局变量的解决方案。我认为编写这样的硬代码并不好。

//in some event handler
if (sometag)
{
   //do something.

}

代码并不优雅。有什么想法或我不知道的事情吗?

4

3 回答 3

2

如果您只是在谈论您自己的处理程序,并且您希望为它们设置一个全局“开/关”开关,那么拥有一个您的处理程序测试的中心变量是一种完全合理的方法,既不错也不错。(我实际上不会让它成为一个全局变量,只是一个所有处理程序都可以访问的变量。)

或者,您可以命名您的事件:

$("some selector").bind("click.myevents", handler);
$("some selector").bind("hover.myevents", handler);
// ...

...并将名称空间用于unbind所有这些:

$("*").unbind(".myevents");

...但是没有简单的方法可以重新打开它们,而且开销似乎有点高。

于 2013-04-02T07:58:11.773 回答
1

你的问题非常广泛和笼统。如果你能说出你的精确用例,有人可能会给你一个更好的答案。

在 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

于 2013-04-02T08:25:13.927 回答
0

如果您真的想取消绑定所有事件处理程序,您可以使用.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
于 2013-04-02T08:00:15.123 回答