有没有办法只解除非命名空间事件的绑定?

Posted

技术标签:

【中文标题】有没有办法只解除非命名空间事件的绑定?【英文标题】:Is there a way to unbind non-namespaced events only? 【发布时间】:2011-10-17 14:42:40 【问题描述】:

有没有办法取消绑定不属于 jQuery 中特定命名空间的事件?如果开发者没有指定命名空间,那么 inm 是否存在事件所属的默认命名空间?

例如:

$('#id').bind('click.myEvents', handler); //a click with a specific namespace: myEvents
$('#id').bind('click',handler2); //a click without a specific namespace

我能否在不影响第一个点击事件的情况下定位第二个点击事件?

【问题讨论】:

【参考方案1】:

给你:

// unbinds non-namespaced event handlers
function unbind( elem, type )    
    $.each( $( elem ).data( 'events' )[ type ], function () 
        if ( this.namespace === '' ) 
            $( elem ).unbind( type, this.handler );
        
    );

然后:

unbind( elem, 'click' );

elem 是对您的 DOM 元素 (var elem = $( '#id' )[0];) 的引用。

现场演示: http://jsfiddle.net/simevidas/2p25N/1/

【讨论】:

【参考方案2】:

This 展示了如何选择不属于另一个选择器的元素。我认为您可能可以选择不是in a namespace 的所有内容。 不过我没试过,祝你好运。

【讨论】:

【参考方案3】:

我不知道,但您可以将所有其他通用事件附加到您自己的通用命名空间。相关处理程序不会覆盖彼此的引用。

如果这对于实现一个巨大的应用程序来说太麻烦了,并且您担心在命名空间中取消绑定然后重新绑定太多元素的成本,请查看 JQ 的“委托”方法和事件委托,如果您“不熟悉。

事件冒泡到父元素。事件委托使用此行为将一个处理程序置于父阻塞点,检查事件对象以查看触发事件的原始元素,然后执行该行为。在一个元素上绑定/重新绑定并不是很多开销,因此这可能是您最好的选择。

【讨论】:

以上是关于有没有办法只解除非命名空间事件的绑定?的主要内容,如果未能解决你的问题,请参考以下文章

命名空间jquery

浅谈jquery事件命名空间

覆盖 gSOAP 中的命名空间

echarts 树图

在命名空间中包装外部库

JS命名空间