使用参数添加和删除事件监听器

2024-03-21

我正在写一个普通 JavaScript工具,启用后将事件侦听器添加到传递给它的每个元素。

我想做这样的事情:

var do_something = function (obj) {
        // do something
    };

for (var i = 0; i < arr.length; i++) {
    arr[i].el.addEventListener('click', do_something(arr[i]));
}

不幸的是,这不起作用,因为据我所知,添加事件监听器时,参数只能传入匿名函数:

for (var i = 0; i < arr.length; i++) {
    arr[i].el.addEventListener('click', function (arr[i]) {
        // do something
    });
}

问题是我需要能够在禁用该工具时删除事件侦听器,但我认为不可能使用匿名函数删除事件侦听器.

for (var i = 0; i < arr.length; i++) {
    arr[i].el.removeEventListener('click', do_something);
}

我知道我可以轻松地使用 jQuery 来解决我的问题,但我正在努力最小化依赖性。jQuery 必须以某种方式解决这个问题,但代码有点混乱!


这是无效的:

arr[i].el.addEventListener('click', do_something(arr[i]));

监听器必须是一个函数参考。当您调用函数作为参数时addEventListener,函数的返回值将被视为事件处理程序。您不能在侦听器分配时指定参数。处理函数将始终被调用event作为第一个参数传递。要传递其他参数,您可以将处理程序包装到匿名事件侦听器函数中,如下所示:

elem.addEventListener('click', function(event) {
  do_something( ... )
}

为了能够通过删除removeEventListener您只需命名处理函数:

function myListener(event) {
  do_something( ... );
}

elem.addEventListener('click', myListener);

// ...

elem.removeEventListener('click', myListener);

要访问处理函数中的其他变量,可以使用闭包。例如。:

function someFunc() {
  var a = 1,
      b = 2;

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

使用参数添加和删除事件监听器 的相关文章

  • 取消html5浏览器中的单图请求

    我正在动态加载 大 图像以绘制到 html5 画布中 如下所示 var t new Image t onload t src http myurl 但每隔一段时间就会想取消图片请求完全地 我想出的唯一方法是设置src to i e t sr
  • 访问sendBeacon发送的数据

    文档表明sendBeacon通过发送其数据HTTP POST request 但在 PHP 中 POST变量似乎是一个空数组 这是我的 JavaScript 代码 navigator sendBeacon beacon log php My
  • 动态速度计 javascript 或 jquery 插件

    我希望有动态ajax插件在页面上显示速度计 一个想法是我设置一个背景并旋转针 有人知道相关插件吗 这里有一些供您参考 http bernii github com gauge js http bernii github com gauge
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • 消息“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调”

    我正在使用 Puppeteer 和 Jest 来运行一些前端测试 我的测试如下 describe Profile Tab Exists and Clickable settings user gt test Assert that you
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • Chartjs刻度标签位置

    尝试让 Y 轴刻度标签看起来像image https i stack imgur com XgoxX png 位于秤顶部且不旋转 缩放选项当前如下所示 scales yAxes id temp scaleLabel display true
  • 类型“typeof import("/home/kartik/Desktop/Ecommerce/ecommerce/node_modules/firebase/index")”上不存在属性“auth”。 TS(2339)

    我是 FireBase 的初学者 我正在尝试使用 Angular 通过 FireBase 实现 Google 登录 我在 auth 时收到上述错误 我特此附上login component ts和package json package l
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • 计算java中两个日期之间的月份[重复]

    这个问题在这里已经有答案了 我需要计算两个日期之间的月份 如果 startDate 2013 01 01 endDate 2013 01 31 答案应该是 1 startDate 2013 01 01 endDate 2013 02 01
  • Rails:虚拟属性和表单值

    我有一本带有虚拟属性的模型书 用于从书籍表单创建编辑器 代码如下 class Book lt ActiveRecord Base has many book under tags has many tags through gt book
  • 如何使用 JDBC 连接 XAMPP MySQL 本地数据库?

    我有一个用Java编写的俄罗斯方块游戏 它使用DB来记录高分 只要我使用远程 MySQL DB 它就可以正常工作 但现在我尝试使用 XAMPP MySQL 设置本地主机 DB 并且在命令中它一直像 SQLException 通信链接失败 一
  • 我可以使用 JavaScript/JQuery 将上传的文件添加到 ASP.NET 中的 Request.Files 中吗?

    我不完全确定如何使用 JavaScript 将文件添加到 Request Files 中 这就是我要去的 var x input type file eq 0 Add the data to the hidden field hiddenF
  • 指定 nodeSize 时 d3 树的居中发生变化

    我为此使用 d3 v4 当我有 var treemap d3 tree size height width 这棵树很好地居中 但是 因为我想指定节点之间的垂直间距 当我将其更改为 var treemap d3 tree size heigh
  • 适合程序员的 TCP/IP 网络书籍? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • React useEffect 钩子有条件地加载 onsnapshot

    我正在尝试执行以下操作 但似乎无法获得最合适的解决方案 在我的 React 应用程序 应用程序组件 的顶层 我正在加载 firebase 和 firestore 我有一个反应上下文 其中存储了我的身份验证信息 身份验证上下文不会立即加载 而
  • 在 Flexbox 中从纵向布局切换到横向布局

    我想实现以下Layout https i stack imgur com tOpuX png与弹性盒 您可以在图片中看到两个方向 左侧为纵向视图 右侧为横向视图 前提是我想让我的html尽可能短 如果可能的话 有没有办法用 Flex 来做到
  • 将 Outlook 邮件正文另存为 PDF

    我正在使用 Outlook 和 C 我的学校练习是在不使用额外软件的情况下将电子邮件正文转换为 pdf 就我而言 我想保留电子邮件文本格式 以便解决我的问题 我考虑将电子邮件正文转换为 RTF 文件 然后使用 C 使用 Word 应用程序打
  • Carbon createFromFormat 意外结果

    createFromFormat 结果提前一个月 var dump GET archive var dump Carbon createFromFormat m Y GET archive Result string 11 2015 len
  • 无法导入 gsutil

    我觉得我把一切都设置正确了 我遵循了这些指示 https developers google com storage docs gsutil install install 并从 tar 文件安装 我的主目录现在有一个文件夹 gsutil
  • cvxpy:“sum_entries”未定义

    我正在尝试使用 CVXPY 解决 Python 中的投资组合优化问题 但收到错误 sum entries is not Defined 我正在使用 Anaconda 2 7 和 Jupyter 笔记本 我已经使用 conda pip ins
  • 了解 Azure 事件中心分区使用者模式

    Azure 事件中心使用分区使用者模式中描述的docs https learn microsoft com en us azure event hubs event hubs features 当涉及到现实世界场景时 我在理解该模型的消费者
  • 如何比较2个整数是否相等?

    如何在 C 中比较两个整数 我有一个用户输入 ID 即int 然后我就有了一个属于我的结构一部分的联系 ID 联系 ID 是int also 我需要比较它们是否相同 才能知道它存在 我做了这样的事情 if user input id com
  • Ctrl+D 后如何重新启动 stdin?

    运行一个需要来自终端的输入的程序 我可以通过 Ctrl D 关闭 stdin 之后有什么办法重新打开标准输入吗 In linux questions tagged linux and on POSIXy systems in general
  • 根据远程主机名更改 tmux 窗格的背景颜色

    如果我在单个窗格中从 tmux ssh 到远程服务器 是否可以根据服务器名称更改窗格的背景颜色 假设我所有的产品服务器都以prod XYZ开发服务器以dev XYZ 如果我通过 ssh 连接到这两台服务器 我可以根据我所在的服务器类型为它们
  • 有没有办法用 CSS 动画制作省略号动画?

    我正在尝试制作省略号动画 并且想知道 CSS 动画是否可以实现 所以它可能就像 Loading Loading Loading Loading Loading 基本上就这样继续下去 有任何想法吗 编辑 像这样 http playground
  • 如何在 CoffeeScript 中传递两个匿名函数作为参数?

    我想传递两个匿名函数作为 jQuery 悬停的参数 如下所示 element hover function do stuff on mouseover function do stuff on mouseout 只需一个就很容易 hover
  • git 错误; RPC失败;结果=22,HTTP 代码=401

    我正在尝试将一些颠覆代码和历史记录放入 TFS 中 通过 GIT 似乎是一个快速的胜利 并按照以下网址中的步骤进行操作 http www incyclesoftware com 2013 08 how easy its to migrate
  • 使用参数添加和删除事件监听器

    我正在写一个普通 JavaScript工具 启用后将事件侦听器添加到传递给它的每个元素 我想做这样的事情 var do something function obj do something for var i 0 i lt arr len