取消绑定除特定命名空间之外的所有命名空间中的事件

Unbind events from all namespaces except a particular one

本文关键字:命名空间 事件 绑定 取消      更新时间:2023-09-26

如果我将jQuery scroll事件处理程序绑定到特定的命名空间…

$(window).on('scroll._my_namespace',function() { ... });

…有没有任何方法可以解除绑定所有scroll事件处理程序(分配给该命名空间的事件处理程序除外)?例如,如果我这样做…

$(window).off('scroll._my_namespace');

…它会解除特定scroll处理程序的绑定,如果我这样做…

$(window).off('scroll');

…它将解除所有scroll处理程序的绑定。

到目前为止我尝试了什么:

$(window).off('scroll.'); // Doesn't seem to do anything

从没想过这会奏效,但我想我最好在发布之前试试:

$(window).off('scroll:not("._my_namespace")'); // Also doesn't do anything

我想做的是解除所有scroll事件处理程序的绑定,分配给特定命名空间的事件处理程序除外。有办法做到这一点吗

除了为所有必须删除的处理程序提供另一个公共命名空间之外,我不知道如何使用公共api。

但使用私人活动收藏,你可以尝试类似的东西

var events = $._data(window, 'events');
for (var i = events.scroll.length - 1; i >= 0; i--) {
    var handler = events.scroll[i];
    if (handler && handler.namespace != 'ns') {
        $(window).off('scroll', handler.handler)
    }
}

$(window).on('scroll.ns', function(e) {
  console.log('x', e.type, e.handleObj.namespace, e)
});
$(window).on('scroll.ns2', function(e) {
  console.log('y', e.type, e.handleObj.namespace, e)
});
$(window).on('scroll.t', function(e) {
  console.log('z', e.type, e.handleObj.namespace, e)
});
$('button').click(function() {
  var events = $._data(window, 'events');
  for (var i = events.scroll.length - 1; i >= 0; i--) {
    var handler = events.scroll[i];
    if (handler && handler.namespace != 'ns') {
      $(window).off('scroll', handler.handler)
    }
  }
});
body {
  height: 1000px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button>Remove</button>

循环遍历您的名称空间,并为每个名称空间调用off,但调用您不想要的名称空间。