如何仅删除实例中添加的事件处理程序?

Posted

技术标签:

【中文标题】如何仅删除实例中添加的事件处理程序?【英文标题】:How to remove only events handlers added in the instance? 【发布时间】:2014-09-21 03:23:55 【问题描述】:

我有一个 jQuery 插件,它在某些元素上附加事件处理程序。

在插件的销毁方法中,我希望删除这些事件处理程序,但只删除由该插件实例添加的那些。

如果我这样做 .off('.myPlugin'); 它可能会删除由其他插件实例添加的事件处理程序,我不希望这样做。

我问的有可能吗?

【问题讨论】:

你能跟踪你绑定的事件吗? 你的意思是把事件处理函数存储在一个数组中还是什么的?是的。我如何将它传递给 off() ? @thelolcat 循环遍历数组并调用.off("eventName", eventHandler) 【参考方案1】:

jQuery 具有事件命名空间,可以用于此目的。

您为添加的事件命名,因此可以在不删除其他事件处理程序的情况下删除它们,因此在插件中您将添加所有这样的事件处理程序

$( "p" ).on( 'click.pluginName', function(event) 
    // do stuff on click
);

当您想要删除该点击处理程序时,并且只删除该点击处理程序,而不是其他点击处理程序,您可以这样做

$( "p" ).off( 'click.pluginName');

这通常是在插件中完成的。

文档:jQuery event.namespace


如果您需要识别插件的每个实例,您可以使用标志、计数器或其他任何东西。 像这样的东西会起作用

$.fn.plugin = function() 
    var self  = this,
        count = $.fn.plugin.counter++;

    $(this).on('click.pluginName' + count, function() 
        // do stuff on click
    );

    this.destroy = function() 
        self.off('click.pluginName' + count)
    



$.fn.plugin.counter = 0;

或其他变体

$.fn.plugin = function(arg) 
    if (arg == 'destroy') 

        var count = $(this).data('count');
        $(this).off('click.pluginName' + count);

    else

        var count = $.fn.plugin.counter++;

        $(this).data('count', count).on('click.pluginName' + count, function() 
            alert('clicked')
        );
    

    return this;


$.fn.plugin.counter = 0;

FIDDLE

【讨论】:

我正在使用命名空间,但所有实例都有相同的命名空间:|【参考方案2】:

我能想到的唯一方法是为该插件的每个实例生成一个 GUID,然后在绑定和取消绑定事件时将其连接到您的插件名称。

【讨论】:

以上是关于如何仅删除实例中添加的事件处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何从事件中删除所有事件处理程序

jquery,添加和删除事件处理程序[重复]

如何将事件处理程序绑定到 jQuery 中的实例?

如何在 MFC CDialog 类中自动删除事件处理程序?

是否可以在 javascript 中删除给定元素的所有事件处理程序?

如何删除“按钮”的“单击”事件的所有事件处理程序?