JQuery的。删除委派事件的所有侦听器

时间:2014-03-13 13:15:30

标签: javascript jquery events listener

我有一些带有元素的容器。他们有一些委派的事件监听器。

喜欢这个

$('body').on('click', '.container .button', function() { ... });

我想从容器中的所有元素中删除所有侦听器(无论事件类型和选择器)。

喜欢这个

 $( "body" ).off("*", ".container *");

但它没有用。

有人可以帮忙吗?感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

更新回答

在评论中,你说过:

  

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

  

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

哎哟。这将使它变得非常困难,尤其是因为一些委托处理程序可能与容器内部和外部的元素有关。

唯一想到的就是要列出你想要阻止的所有事件名称(并不是那么多):

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

这会在事件到达body之前停止,因此在委托的处理程序看到它之前:Live Example

<!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");

...完全删除所有命名空间的,而不仅仅是那个选择器。

示例:Live Copy

<!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>

答案 1 :(得分:1)

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

在Jquery在线文档中,它提到它会删除附加到元素

的所有事件句柄
  

可以使用.unbind()删除附加.bind()的事件处理程序。   (从jQuery 1.7开始,首选.on()和.off()方法   在元素上附加和删除事件处理程序。)在最简单的情况下,   没有参数,.unbind()删除附加到的所有处理程序   元素:

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

如果有错,请纠正我

答案 2 :(得分:1)

要从元素中删除所有委派事件而不删除非委派事件,您只需使用特殊值185 MB for 512 MB RAM device 390 MB for 1GB RAM device 900 MB for 2GB RAM device

**

答案 3 :(得分:0)

这会奏效 http://jsfiddle.net/KT42n/9/

遗憾的是,某些东西不起作用

 $('body').undelegate('.container > * ','click');