JQuery. 删除委派事件上的所有监听器

4
我有一个容器,里面有一些元素。它们有一些委托事件监听器。
就像这样:
$('body').on('click', '.container .button', function() { ... });

我想从容器中的所有元素中删除所有监听器(无论事件类型和选择器)。
像这样:
 $( "body" ).off("*", ".container *");

但它不起作用。

有人能帮忙吗?提前感谢您的帮助。

4个回答

7

更新的答案::

在评论中,你说:

好的。我有一个jsfiddle来解释这个问题。http://jsfiddle.net/KT42n/3 我想从容器中删除所有元素的处理程序

不幸的是,在我的情况下,使用命名空间是不可能的

糟糕。这将使它非常困难,因为一些委托处理程序可能涉及容器内外的元素。

唯一想到的事情需要列出您想要防止的所有事件名称(并不是很多):

$(".container").on("click mousedown mouseup etc.", false);

那样可以在事件到达 body 之前停止它,因此委托处理程序就不会看到它:实时示例
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<meta charset=utf-8 />
<title>Stop Delegated Handlers Within Container</title>
</head>
<body>
  <p>Outside the container</p>
  <div class="container">
    <p>Inside the container</p>
  </div>
  <script>
    (function() {
      // Other handlers
      $("body").on("click", "p", function() {
        display("paragraph clicked");
      });

      // Prevent clicks within container
      $(".container").on("click mousedown etc", false);

      function display(msg) {
        var p = document.createElement('p');
        p.innerHTML = String(msg);
        document.body.appendChild(p);
      }
    })();
  </script>
</body>
</html>

原始回答:

您可以像这样从 body 中删除所有处理程序:

$("body").off();

这包括委托的处理程序。

如果你想保留一些处理程序但不保留其他处理程序,我能想到的最简单的方法是在挂钩事件时对其进行命名空间处理,例如:

$("body").on("click.foo", "selector", ...);

...等等。然后您可以使用命名空间来删除它们:

$("body").off(".foo", "selector");

...或者仅仅是

$("body").off(".foo");

我希望您能完全删除所有命名空间,而不仅仅是该选择器的命名空间。

示例:实时副本

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<meta charset=utf-8 />
<title>Removing All Delegated Handlers</title>
</head>
<body>
  <div class="clickable">Click me</div>
  <div class="mousemoveable">Mouse over me</div>
  <input type="button" id="theButton" value="Remove handlers">
  <script>
    (function() {
      $("body").on("click.foo", ".clickable", function() {
        display("click");
      });
      $("body").on("mousemove.foo", ".mousemoveable", function() {
        display("mousemove");
      });
      $("#theButton").click(function() {
        $("body").off(".foo");
      });
      function display(msg) {
        var p = document.createElement('p');
        p.innerHTML = String(msg);
        document.body.appendChild(p);
      }
    })();
  </script>
</body>
</html>

@T.J Crowder:希望你现在知道了,有些签名中事件名称是可选的,并且单个字符串参数并不总是被视为事件名称。 - T J
@TilwinJoy:我说的是“事件名称和/或事件命名空间” 。你最初的答案在前十分钟左右是完全错误的。你传递的是一个选择器,而不是一个命名空间。更新后的答案还可以,除了它是这个的重复。如果你要在SO上做出贡献,你就需要习惯于当你犯错时人们会在没有评论的情况下进行投票(以及在没有投票的情况下进行评论)。每个人有时都会犯错。把它看作是一个“没有用”的答案,而不是个人攻击,你就会做得很好。 - T.J. Crowder
@T.J.Crowder 在阅读文档后你想出了这个,但在此之前你的评论也是“完全错误的”。 - T J
@TilwinJoy:不,我是通过思考问题想出来的。没有必要对我进行攻击。 - T.J. Crowder
@see613:我已经更新了一个可能的解决方案。虽然不太美观,需要列出一堆事件名称,但应该可以工作。 - T.J. Crowder
显示剩余5条评论

1

$("body").unbind() 移除所有处理程序

Jquery在线文档中提到,它会移除附加到元素的所有事件处理程序。

使用.bind()附加的事件处理程序可以使用.unbind()移除。 (自jQuery 1.7以来,.on()和.off()方法更适用于在元素上附加和删除事件处理程序。)在最简单的情况下, 不带参数,.unbind()将删除附加到元素的所有处理程序:

链接: http://api.jquery.com/unbind/

如果有误请纠正我


1
@War10ck:不,那不是真的。但我不知道 unbind 是否会解除使用 delegateon 钩子绑定的 委托 处理程序。 - T.J. Crowder

1

如果您想从一个元素中删除所有委派事件而不删除非委派事件,您只需要使用特殊值**

$('body').off('click', '**');


0

如果有些孩子没有ID怎么办?(因为他们可能没有) - see613
我猜你需要使用你所用的选择器来调用undelegate/off函数,将所有项目取消委托。然后,使用一个不包含.container中的选择器来调用delegate/on函数。 - horizons
也许这可以帮助http://jsfiddle.net/KT42n/12/ 我找不到更好的解决方案,因为函数delgate/on或undelegate/off的选择器都不允许复杂的选择器... - horizons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接