当前位置: 首页 > 面试题库 >

删除通过绑定添加的事件侦听器

费和惬
2023-03-14
问题内容

在JavaScript中,删除使用bind()添加为事件侦听器的函数的最佳方法是什么?

(function(){

    // constructor
    MyClass = function() {
        this.myButton = document.getElementById("myButtonID");
        this.myButton.addEventListener("click", this.clickListener.bind(this));
    };

    MyClass.prototype.clickListener = function(event) {
        console.log(this); // must be MyClass
    };

    // public method
    MyClass.prototype.disableButton = function() {
        this.myButton.removeEventListener("click", ___________);
    };

})();

我能想到的唯一方法是跟踪添加了bind的每个侦听器。

上面的示例使用此方法:

(function(){

    // constructor
    MyClass = function() {
        this.myButton = document.getElementById("myButtonID");
        this.clickListenerBind = this.clickListener.bind(this);
        this.myButton.addEventListener("click", this.clickListenerBind);
    };

    MyClass.prototype.clickListener = function(event) {
        console.log(this); // must be MyClass
    };

    // public method
    MyClass.prototype.disableButton = function() {
        this.myButton.removeEventListener("click", this.clickListenerBind);
    };

})();

有没有更好的方法可以做到这一点?


问题答案:

尽管@machineghost所说的是正确的,但事件的添加和删除方式相同,但等式中缺少的部分是:

.bind()调用后会创建一个新的函数引用!

因此,要添加或删除它,请将引用分配给变量:

var x = this.myListener.bind(this);
Toolbox.addListener(window, 'scroll', x);
Toolbox.removeListener(window, 'scroll', x);

这对我来说是预期的。



 类似资料:
  • 问题内容: 我有一个类似的反应成分: 这里,事件列表器已添加到组件。当我刷新页面时,它弹出窗口要求离开页面。 但是当我转到另一个页面并刷新时,它再次显示相同的弹出窗口。 我正在从中删除组件。那为什么不将其删除呢? 如何删除其他页面上的事件? 问题答案: 本应该得到的引用到在分配相同的回调。重新创建该功能将无效。解决方案是在其他地方(在本示例中)创建回调,并将其作为对和的引用传递: 反应钩子 您可以

  • 我的代码使用jQuery。我有一个密码输入框,我想要得到输入的密码任何时候。 下面是我的代码: 我确信这是一个正确的代码,因为当我在浏览器的控制台中输入它时,它可以工作,但当我重新加载页面时,它就不工作了 我能做什么?

  • 我可以在下面的代码中为添加事件侦听器,但不能添加到。 是不是因为twitter做了一些事情不让我这么做?有办法绕过它吗?

  • 问题内容: 我想删除使用添加的所有特定类型的事件监听器。我看到的所有资源都在说您需要执行以下操作: 但是我希望能够在不知道当前状态的情况下清除它,如下所示: 问题答案: 如果不拦截呼叫并跟踪侦听器,或者使用不幸的是允许使用此类功能的库,那么这是不可能的。 您可以做的最接近的事情是通过克隆元素来删除所有侦听器,这不会克隆侦听器集合。 注意:这还将删除元素子级上的侦听器。

  • 从元素中移除事件侦听器。 使用 EventTarget.removeEventListener() 从元素中删除一个事件监听器。 省略第四个参数 opts ,则默认使用 false 或者根据添加事件监听器时使用的选项来指定它。 const off = (el, evt, fn, opts = false) => el.removeEventListener(evt, fn, opts); con

  • 我想从外部源向fullcalendar jquery插件添加一个事件。我需要事件标题;开始日期和结束日期。我读到回调函数是在您将外部源放到日历上时调用的。这将报告警报中的开始日期。选项显示事件的标题。此警报在回调后显示。这是代码: 如何从函数的回调中获取开始日期值?