”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么在事件处理程序中使用箭头函数时“this”会出现意外行为?

为什么在事件处理程序中使用箭头函数时“this”会出现意外行为?

发布于2024-11-08
浏览:512

Why does `this` behave unexpectedly when using arrow functions in event handlers?

JavaScript - 箭头函数和事件处理程序

当使用箭头函数作为事件处理程序的回调时,函数中的 this 值是意外的。这篇博文解释了此行为背后的原因,并提供了使用 event.currentTarget.

箭头函数和词法作用域访问预期元素的解决方案

与常规函数不同,箭头函数没有其自己的上下文或范围。相反,它们继承了周围上下文的词汇范围。在提供的示例中,箭头函数是在 dom.videoLinks 的单击事件处理程序中定义的。因此,箭头函数中的 this 指的是 dom.videoLinks 元素。

事件监听器和 event.currentTarget

事件监听器附加到特定元素,并在某些事件发生时执行。当事件被触发时,事件对象包含有关触发事件的目标元素和附加了事件侦听器的当前目标元素的信息。

event.target 属性指的是直接触发事件的元素触发了该事件。在大多数情况下,这是被单击、悬停或接收焦点的元素。

另一方面,event.currentTarget 属性指的是附加了事件侦听器的元素。这是执行时正在处理事件的元素。

在箭头函数中使用 event.currentTarget

要访问箭头函数事件处理程序中的预期元素,请使用 event .currentTarget 而不是这个。这是代码的修改版本:

dom.videoLinks.click((e) => {
  e.preventDefault();
  console.log($(e.currentTarget));
  var self = $(e.currentTarget),
      url = self.attr(configuration.attribute);

  eventHandlers.showVideo(url);

  // Deactivate any active video thumbs
  dom.videoLinks.filter('.video-selected').removeClass('video-selected');

  // Activate selected video thumb
  self.addClass('video-selected');
});

.currentTarget 与 .target

一般来说,在使用事件处理程序时,应该使用 event.currentTarget 而不是 event.target。这是因为事件可以在 DOM 树中向上冒泡或向下捕获,并且使用 event.target 可能并不总是引用您想要定位的元素。

event.currentTarget 始终引用具有事件侦听器的元素无论事件流如何,都附加到它。

结论

在事件处理程序中使用箭头函数时,请记住使用 event.currentTarget 来访问预期元素。在处理事件冒泡和捕获时,请记住 event.target 和 event.currentTarget 之间的区别,以确保准确的事件处理。

最新教程 更多>
  • 如何使用稳健的解决方案增强 PHP 中的 HTML 抓取
    如何使用稳健的解决方案增强 PHP 中的 HTML 抓取
    PHP 中强大的 HTML 抓取解决方案由于其挑剔和脆弱的性质,在 PHP 中使用正则表达式进行 HTML 抓取可能具有挑战性。要获得更强大、更可靠的方法,请考虑使用专门构建的 PHP 包。强烈推荐的一个选项是 PHP Simple HTML DOM Parser。该库擅长处理 HTML(包括无效标...
    编程 发布于2024-11-08
  • 如何检测 Go 标准输入 (Stdin) 中的数据可用性?
    如何检测 Go 标准输入 (Stdin) 中的数据可用性?
    使用 Go 检测标准输入 (Stdin) 中的数据可用性在 Go 中,可以使用以下技术检查标准输入流 (os.Stdin) 中的数据:验证其文件大小。它的工作原理如下:os.Stdin 可以像任何常规文件一样对待,允许我们检查其属性。为此,我们使用 os.Stdin.Stat() 检索 FileIn...
    编程 发布于2024-11-08
  • Wasp:Web 开发中 Django 的 JavaScript 答案
    Wasp:Web 开发中 Django 的 JavaScript 答案
    Wasp v Django: Building a full stack application just got a lot easier Hey, I’m Sam, a backend engineer with a lot of experience with Django....
    编程 发布于2024-11-08
  • 如何在没有键盘中断的情况下通过按键中断 While 循环?
    如何在没有键盘中断的情况下通过按键中断 While 循环?
    通过按键中断 While 循环在使用 while 循环读取串行数据并将其写入 CSV 文件的场景中,您可能希望为用户提供终止循环以停止数据收集的选项。本文探讨了在不显式使用键盘中断的情况下实现此类功能的技术。一种简单的方法是利用 try- except 块来处理 KeyboardInterrupt ...
    编程 发布于2024-11-08
  • 周 oot 训练营学习
    周 oot 训练营学习
    我决定迈出大胆的一步,参加由 LuxDevHQ 组织的我的第一个数据职业训练营。这是一个为期 5 周的训练营,旨在培养实践数据技能。该训练营旨在让人们接触至少 4 个专业领域的各种数据技能。 第一周以信息会议开始,我进行了项目定向,并​​向我介绍了该项目并了解了整个项目的期望。 在这第一周,我学到了...
    编程 发布于2024-11-08
  • 如何使用 Homebrew 和 jenv 在 Mac OS X 上管理多个 Java 版本?
    如何使用 Homebrew 和 jenv 在 Mac OS X 上管理多个 Java 版本?
    在 Mac OS X 上管理多个 Java 版本由于 Java 管理其安装的方式,在 Mac OS X 上安装多个 Java 版本可能是一项挑战。不过,有一个解决方案可以让您轻松安装和管理不同的 Java 版本:Homebrew。使用 Homebrew 和 jenvHomebrew 是一个包管理器,...
    编程 发布于2024-11-08
  • 如何创建 React 应用程序?安装与环境设置
    如何创建 React 应用程序?安装与环境设置
    在开始使用 React 构建应用程序之前,拥有正确的开发环境非常重要。以下是帮助您入门的分步指南: 步骤 1. 安装 Node.js 和 npm 设置 React 环境的第一步是安装 Node.js,因为它提供了在浏览器外部执行代码所需的 JavaScript 运行时。当您安装 Node.js 时,...
    编程 发布于2024-11-08
  • python 并发.futures
    python 并发.futures
    未来 Future 是一个容器,可以保存计算结果或计算期间发生的错误。创建 future 时,它​​以 PENDING 状态开始。该库不打算手动创建此对象,除非出于测试目的。 import concurrent.futures as futures f = futures.Futu...
    编程 发布于2024-11-08
  • 使用纯 Javascript 只需几行即可实现飞向购物车的动画。
    使用纯 Javascript 只需几行即可实现飞向购物车的动画。
    最近,我偶然发现了一个旧教程,展示了使用 jQuery 实现飞行到购物车的动画。我想通过使用纯 JavaScript 实现相同的效果来挑战自己。 我创建了一个包含产品和购物车图标的简单布局。样式并不重要,所以我们不会在这里讨论它。 诀窍是克隆产品图像,将其添加到产品元素之前。然后计算克隆图像和购物车...
    编程 发布于2024-11-08
  • Bokeh 是一个有趣的 Python 数据可视化数据工具
    Bokeh 是一个有趣的 Python 数据可视化数据工具
    数据可视化在解释大量信息方面发挥着关键作用。 Bokeh 等工具已成为构建交互式仪表板和报告的流行解决方案。每个工具都具有独特的优势,具体取决于您项目的复杂性和您首选的编程语言。在本文中,我们将深入研究每个工具,然后重点关注 Bokeh,包括实践示例和云中的部署。 以便... 什么是散景? Boke...
    编程 发布于2024-11-08
  • django-components v 模板现在与 Vue 或 React 相当
    django-components v 模板现在与 Vue 或 React 相当
    嘿,我是 Juro,我是 django-components 的维护者之一。在 v0.90-0.94 版本中,我们添加了一些功能,使模板中的组件使用更加灵活,类似于 JSX / Vue。 (此信息已经有点过时了(一个月前发布;最新的是 v0.101),因为我正忙着添加对 JS / CSS 变量、Ty...
    编程 发布于2024-11-08
  • 在 GitHub-echo 中实现 TOML 配置支持
    在 GitHub-echo 中实现 TOML 配置支持
    介绍 最近,我有机会通过添加对 TOML 配置文件的支持来增强 github-echo 命令行工具。此功能允许用户在 .github-echo-config.toml 文件中设置持久默认选项,从而减少每次使用该工具时手动输入重复配置的需要。在这篇文章中,我将向您介绍我在该功能上的经...
    编程 发布于2024-11-08
  • 如何使用 SimpleXML 和 DOMDocument 删除 XPath 节点?
    如何使用 SimpleXML 和 DOMDocument 删除 XPath 节点?
    SimpleXML:删除 XPath 节点在本文中,我们将探讨如何使用以下方法有效地从 XML 文档中删除父节点: SimpleXML 和 XPath。了解 SimpleXML限制提供的代码尝试使用 SimpleXML 在通过 XPath 找到父节点后删除它。然而,SimpleXML 的 unset...
    编程 发布于2024-11-08
  • 创建一个 React Hook 以任意角度旋转图像
    创建一个 React Hook 以任意角度旋转图像
    在Web开发中,您可能需要旋转图像,这在CSS中很容易做到。像这样的简单代码变换:rotate(90deg);。但是如果我们想用 JS 来做呢? TLDR 将图像绘制到浏览器环境中的画布上并旋转它。但在此之前,我们需要做一些数学运算来保持原始图像的长宽比。 核 假设我...
    编程 发布于2024-11-08
  • Lithe 中间件:它是如何工作的以及如何创建自己的中间件
    Lithe 中间件:它是如何工作的以及如何创建自己的中间件
    中间件提供了一种方便的机制来检查和过滤进入应用程序的 HTTP 请求。 例如,Lithe 包含检查用户是否经过身份验证的中间件。如果没有,中间件会将用户重定向到登录屏幕。如果用户通过身份验证,中间件将允许请求继续。 中间件如何在 Lithe 中工作 在 Lithe 中,中间件是能够访...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3