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

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(使用前将#替换为@)

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

  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • 渲染货币和符号并与来自不同单元格的数据相结合

    我正在使用最新的 jQuery DataTables v1 10 7 我正在尝试将数字解析为以下格式 239 90 USD 我可以使用此命令使货币正常工作 columns data Price render fn dataTable ren
  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • 在新的 Google 协作平台 <嵌入 HTML> 中使用 localStorage 和 IndexedDB 不起作用

    我正在尝试将新的 Google 协作平台用于我开发的网页 但是 我在存储本地数据时遇到了问题 本地文件在 Windows 和 Apple safari chrome 中运行良好 从 Google 协作平台尝试一下 没有什么乐趣 此外 在 s
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • Bootstrap按钮加载+Ajax

    我正在使用 Twitter Bootstrap 的按钮加载状态 http twitter github com bootstrap javascript html buttons http twitter github com bootst
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0

随机推荐

  • 计算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