繁体   English   中英

从所有命名空间中解除绑定事件,除了一个特定的命名空间

[英]Unbind events from all namespaces except a particular one

如果我将 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它们中的每一个,但您不想要他。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM