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

标签 javascript jquery object jquery-plugins jquery-events

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

在插件的 destroy 方法中,我希望删除这些事件处理程序,但仅删除该插件实例添加的事件处理程序。

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

我想问的可以吗?

最佳答案

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

关于javascript - 如何仅删除实例中添加的事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25020672/

相关文章:

javascript - 通过正则表达式 javascript 删除未使用的内容

javascript - 使用 AngularJS 像 JQuery 一样操作 DOM?

javascript - 在 .delay() 5 秒后淡出

javascript - 如何找到存储在对象数组中的值并控制键?

java - java列表的内存占用计算和GC计算

java - 本地创建的对象被另一个全局对象引用时会发生什么

javascript - 使用输入框替换文本区域中的部分字符串(属性)

javascript - 如何设置 HTML 元素的样式以避免悬挂文本?

jquery - 在 Chrome 中动态调整 &lt;input&gt; 大小失败(适用于 IE/Firefox)

javascript - angular2.js 与 angular2.dev.js