添加带有参数的事件侦听器,然后将其删除

2024-04-19

基本场景

这个问题之前已经被问过。其实有人问过标题几乎相同 https://stackoverflow.com/questions/15088010/adding-and-removing-event-listeners-with-parameters但请稍等一下,我认为这个问题还没有一个好的答案。

所以,我们有一个事件监听器:

fancyButton.addEventListener('click', this.launchKitty, true);

然后我们有一个函数:

// assume this.setForLaunch was set somewhere
launchKitty = () => {
  if(this.setForLaunch){ // behold, this!
    console.log('farewell, feline!')
  }
}

我们有一个事件监听器和一个可以访问外部的函数this,这很整洁。移除很简单:

fancyButton.removeEventListener('click', this.launchKitty, true);

但是如果我们不想使用怎么办this?

参数!

如果,而不是依靠this,我们想通过addEventListener一个论点?就像这样:

fancyButton.addEventListener('click', () => {this.launchKitty(true)}, true);

并且稍微修改了一下launchKitty():

launchKitty(setForLaunch) {
  if(setForLaunch){ // now we're using a parameter!
    console.log('farewell, feline!')
  }
}

到目前为止,一切都很好。小猫们推出了。删除监听器怎么样?

fancyButton.removeEventListener('click', () => {this.launchKitty}, true);

不去上班。我们的() => {}是匿名的,因此removeEventListener不知道如何找到它。

问题

我们如何向事件监听器传递一个参数,然后删除所述事件处理程序?

请随意挑战我的任何假设。有很多方法可以启动这只猫。

Thanks!


您应该将当前的匿名函数存储到一个变量中,以便您可以调用removeEventListener稍后再用它:

const launchKittyTrue = () => { this.launchKitty(true) };
fancyButton.addEventListener('click', launchKittyTrue, true);
// later:
fancyButton.removeEventListener('click', launchKittyTrue, true);

为了更加灵活,您可以考虑Map按参数索引,其值是绑定函数:

const boundFns = new Map();
function makeListener(arg) {
  if (!boundFns.has(arg)) {
    boundFns.set(arg, launchKitty.bind(undefined, arg));
  }
  return boundFns.get(arg);
}
function getListener(arg) {
  return boundFns.get(arg);
}
fancyButton.addEventListener('click', makeListener(true), true);
// later:
fancyButton.removeEventListener('click', getListener(true), true);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加带有参数的事件侦听器,然后将其删除 的相关文章

随机推荐

  • XML 验证错误 - 根元素必须与 doctype 匹配

    我正在尝试使用外部 DTD 验证我的 XML 文件 但我每次都会遇到这个错误 Document root element A must match DOCTYPE root test 我不明白这一点 我的 xml 文件的想法是它需要尽可能短
  • VS Code 代码自动自动补全高亮

    当我在 VS Code 中使用自动完成功能时 所选文本会随突出显示的光标位置一起出现 这种突出显示会阻止 VS Code 提供进一步的建议 如何禁用此突出显示 我希望能够连续使用自动完成功能 而不必按 ESC 退出突出显示 VS代码1 44
  • 防止 Spark SQL 中的 SQL 注入 [重复]

    这个问题在这里已经有答案了 我正在使用 Spark SQL 从远程 MYSQL 数据库获取数据 我如何确保 SQL 注入不会发生 因为我似乎无法找到避免 Spark SQl 中 SQL 注入的方法 spark SparkSession bu
  • 计算和显示 ggplot2::geom_密度() 对象峰值的最佳方法是什么?

    我试图找到一种简单直观的方法来计算和显示 ggplot2 geom densis 对象的峰值 这个博客 http ianmadd github io pages PeakDensityDistribution html解释了如何在基础 R
  • python:与cgi脚本中的会话交互

    python cgi 脚本可以向会话写入和读取数据吗 如果是这样怎么办 是否有高级 API 或者我必须推出自己的类 没有 session on cgi 如果您使用的是原始会话 则必须滚动自己的会话处理代码cgi 基本上 会话的工作原理是创建
  • 如何制作仅在系统托盘中运行的 .NET Windows 窗体应用程序?

    我需要做什么才能制作Windows 窗体 https learn microsoft com en us dotnet desktop winforms overview view netdesktop 5 0应用程序能够在系统托盘中运行吗
  • Java:一维数组在内存中总是连续的吗?

    我读过的许多关于这个主题的书籍 文章 以及我使用 Unsafe 编写的一个小程序 都表明 Java 中的一维数组在内存中始终是连续的 那么它是 JLS 规定的还是实施约定 提出这个问题是为了确认这一指示 不 JVM 规范没有任何此类保证 h
  • 如何隐藏 Angular Material mdToast?

    app controller testCtrl function rootScope scope mdToast scope showHideToast function mdToast show template
  • Google Calendar API - 不获取重复事件实例

    我正在尝试使用 V3 API 从 Google 日历获取所有事件 我注意到有关重复事件的问题 对于某些日历上的某些重复事件 仅获取第一个实例 例如 获取总共 8 个实例中的前 5 个实例 一些额外的细节 我已经仔细检查查询日期范围是否正确
  • 协变“Self”类型无法从存储的属性初始值设定项中引用

    在下面的代码中 我不明白为什么在使用时会出现上述错误Self 如果我将其替换为 代码就可以正常工作Fireman final class Fireman var numOfServices 0 private init static var
  • 如何对两个并行数组进行排序? [复制]

    这个问题在这里已经有答案了 我有一个数字数组 int numoftoys 和一个并行的字符串数组 string names 其条目对应于数字 我的作业要求我对数字数组进行排序 因此当我打印时 它首先打印最大的数字 然后打印下一个最高的数字
  • Spring Cloud Config 客户端未从配置服务器加载值

    当我尝试运行 Spring Cloud Config Client 时 我遇到以下问题 Caused by java lang IllegalArgumentException Could not resolve placeholder D
  • Podspec - 排除除子文件夹之外的所有内容

    我有这样的结构 target files target1 target2 target3 例如 我只想包含 target2 并排除其他目标 我如何编写spec exclude files 我找到了这个排除文件的示例 但我不明白如何为整个文件
  • 多项式系数列表

    如何从 SymPy 中的系数列表创建多项式 例如 给定一个列表 1 2 1 我想得到Poly x 2 2 x 1 我试着看看docs http docs sympy org dev modules polys reference html但
  • 弹簧致动器上的不同端口

    我们有以下弹簧设置 我们的应用程序在端口 80 上运行 但我们的 managment server port 设置为 8081 并且我们已经使用此安全端口对管理端点进行多次检查 server port 80 management serve
  • CSS 在自定义 HTML 元素上无法正常工作

    我一直在尝试通过扩展来制作自定义 HTML 元素HTMLElement班级 我尝试通过链接与其他两个文件位于同一目录中的 CSS 文件来添加一些样式 index html and custom css 主文件夹 索引 html 自定义 cs
  • 禁用 Google 同意屏幕上的复选框

    我们正在使用 Gmail NET SDK 实现 Gmail 发送 ASP NET Web 应用程序 为此 我们需要以下所有范围 电子邮件 个人资料 openid https www googleapis com auth gmail sen
  • 如何自动化 xceed updown 控件

    对于我的 WPF 应用程序 我正在使用 TestStack White 进行 UI 自动化测试 我在我的应用程序中使用 xceed wpf 工具包中的 DoubleUpDown 控件 如何在 UI 自动化测试中访问 DoubleUpDown
  • 在imageview中播放动画GIF图像文件

    我正在制作一个 Android 应用程序 我想在其中播放图像视图中的 GIF 文件 我尝试了很多方法 制作了自定义类 但没有成功 以前有人实施过这个吗 您可以在 Android SDK 示例中找到示例代码 gif 图像显示在扩展的活动中Vi
  • 添加带有参数的事件侦听器,然后将其删除

    基本场景 这个问题之前已经被问过 其实有人问过标题几乎相同 https stackoverflow com questions 15088010 adding and removing event listeners with parame