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

2024-01-12

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

Example

(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", ___________);
    };

})();

我能想到的唯一方法是跟踪通过绑定添加的每个侦听器。

上面的例子使用了这个方法:

(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()叫做。

See bind() 会改变函数引用吗? |怎么设置永久? https://stackoverflow.com/questions/14417890/does-bind-change-the-function-reference-how-to-set-permanently?lq=1

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

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

这对我来说是预期的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除通过绑定添加的事件侦听器 的相关文章

随机推荐

  • C++ 中的 popen 等效项

    他们有C吗popen C 中的等价物 您可以使用 尚未正式 升压过程 http www highscore de boost process 如果您想要一种面向对象的方法来管理子流程 或者你可以只使用popen本身 如果你不介意这一切的 C
  • 使用 ggplot2 绘制时间序列图

    我有一个实验 研究了随着时间的推移 三种不断进化的酵母菌群 在离散时间点 我们测量了它们的增长 这是响应变量 我基本上想将酵母的生长绘制为时间序列 使用箱线图来总结每个点的测量结果 并分别绘制三个群体中的每一个 基本上 看起来像这样 作为新
  • H2内存数据库初始化数据

    我将 H2 与 Hibernate 结合使用来动态生成内存数据库以进行单元测试 我成功创建了数据库 一切正常 但我有一个问题我不知道如何处理 我需要在执行测试之前将参考数据加载到数据库进行测试 我将此数据存储为 SQL 插入文件 我只需要在
  • 如何在 Firebase 事件分析中查看捆绑包参数

    我有一个独特的按钮 位于 4 个不同的片段中 这些独特的按钮在所有这些片段中执行类似的操作 但进行了一些调整 由于所有这些事情都很相似 我将它们记录在事件名称 unique btn click event 下 val eventName u
  • 针对 Azure 移动服务和 Javascript 客户端启用 SIignalR 身份验证

    我花了很长时间试图弄清楚如何在使用 JavaScript 客户端时通过 SignalR 进行 AMS 身份验证 我下载了 Azure 移动服务的 JavaScript 客户端 我在 AMS 上安装了 Signal R 一切都已连接并准备就绪
  • SQL 查询中 SELECT 语句中的WITH TIES 关键字有什么用?

    SELECT TOP 5 WITH TIES EmpNumber EmpName FROM Employee Order By EmpNumber DESC 上面的查询返回五个以上的结果 With Ties 关键字 SQL 查询有什么用 F
  • IIS Express 是否支持 ASP Classic?

    我忘记在我的最后一个开发机器 repave 中安装 IIS 并想也许新的 IIS Express 可以满足运行我支持的旧 ASP Classic 站点的要求 您知道 IIS Express 是否支持 ASP Classic 是的 它支持 更
  • 如何增加 MySQL 5.1 中的密钥长度?

    当运行创建索引的 Rails 迁移时 我得到 Mysql Error Specified key was too long max key length is 1000 bytes CREATE UNIQUE INDEX index mat
  • 使用find初始化常量?

    像这样的事情 类别类别 SOME CATEGORY find by name some category end 类别 SOME CATEGORY尝试过没有问题 但想知道这是否是一个坏主意 以及原因 如果有 thanks 如果您不想每次都访
  • 文本节点的 jQuery 自定义选择器

    我想使用 jQuery 自定义选择器从 DOM 元素中提取文本 它应该只选择没有标记同级的文本节点 很像 XPath 中的 text 背景 我正在开发一个 Firefox 扩展 它可以在非常不同的网站上提取一些特定信息 例如用户名 现在我希
  • 单击 HTML 表并获取行号(使用 Javascript,而不是 jQuery)

    我想知道如何单击 HTML 表格中的按钮并获取返回给我的行号和列号 例如 使用下表 table tr td td tr table
  • 为什么我的 ajax 函数不能无限滚动?

    我正在使用 waypoints js 和 Django 后端构建一个具有无限滚动的网页 问题是 我的 jquery 和 ajax 函数在处理第一页上的内容时无法处理新生成的内容 编辑 我正在更新我的代码 以便更容易理解我的问题 div cl
  • 用于更新 C++ 函数定义的 Vim 插件

    我正在寻找一个可以做这些事情的 Vim 插件 假设我有一个函数 cpp file void myFunction int arg1 int arg2 int arg3 code 函数定义定义在 h文件 所以每次我更改函数名称或向函数添加新参
  • 当其超类是抽象的时,为什么 Rails 不尊重与 STI 关联的belongs_to 对象的类型?

    我在我正在开发的 Rails 应用程序中遇到了这种相当奇怪的行为 我在继承层次结构中有多种类型的 Post 并且 Post has many FeedEntries class Post lt ActiveRecord Base has m
  • 从多种格式的字符串中解析 R 中的日期

    我在 R 中有一个大约有 2 000 行的 tibble 它是使用 read excel 从 Excel 导入的 其中一个字段是日期字段 dob 它作为字符串导入 并具有三种格式的日期 YYYY MM DD DD MM YYYY XXXXX
  • Raku .hyper() 和 .race() 示例不起作用

    以下示例代码应加速 Raku 程序的执行 for 1 4 race say Doing sleep 1 say now INIT now 我记得不久前它还有效 但现在我总是以 4 秒的运行时间结束 同样使用 race 或添加参数不会改变任何
  • 防病毒误判c#.net程序为木马

    我使用 C Net 开发了一个 Windows 服务 它收集数据并在客户端用户许可的情况下使用自定义 API 定期发送到我的服务器 在用户安装防病毒软件 卡巴斯基 之前 它一直工作正常 它误报地将我的 exe 检测为PDM trojan w
  • flutter getx 中对 null 值使用的 Null 检查运算符

    我的代码给出了Null check operator used on a null value错误 尽管我在代码中找不到任何空值 我不知道哪个屏幕实际上导致了错误 但肯定是这两个屏幕中的一个 启动画面 import dart async i
  • 用于 Tesseract 和 OpenCV 的 CMake

    我是 Linux 编程新手 我正在尝试创建一个 OCR 应用程序Ubuntu 12 10 using 超立方体 http code google com p tesseract ocr E2 80 8E and OpenCV http ww
  • 删除通过绑定添加的事件侦听器

    在 JavaScript 中 删除使用 bind 添加为事件侦听器的函数的最佳方法是什么 Example function constructor MyClass function this myButton document getEle