在何处添加事件侦听器的最佳实践

2024-02-29

在我的页面上,用户单击一个元素以对其进行编辑。为了促进这一点,我分配了班级editable所有这些元素。

我应该如何监听所有这些元素的点击?目前,我正在这样做:

document.body.addEventListener("click", (event) => {
  if (event.target.classList.contains("editable")) {
    // do stuff
  }
});

另一种方法是在每个元素上设置一个侦听器,如下所示:

const editables = document.getElementsByClassName("editable");
for (const editable of editables) {
    editable.addEventListener("click", editElement);
}

在我看来,第一种方法对于性能来说一定更好,因为它只监听一个元素,但是是否有可能通过将所有此类事件附加到 body 元素来降低性能?是否还有其他我忽略的考虑因素(例如事件处理的浏览器实现)建议采用第二种方式?


简短回答:肯定是用第一种方法。事件委托的性能更高,但需要在代码中添加额外的条件,因此它基本上是复杂性与性能的权衡。

较长的答案:对于少量元素,添加单独的事件处理程序效果很好。然而,随着您添加越来越多的事件处理程序,浏览器的性能开始下降。原因是监听事件是内存密集型的。

然而,在 DOM 中,事件从最具体的目标“冒泡”到最一般的目标,并在此过程中触发任何事件处理程序。这是一个例子:

<html>
    <body>
        <div>
            <a>
                <img>
            </a>
         </div>
    </body>
</html>

如果您点击<img>标签,单击事件将按以下顺序触发任何事件处理程序:

  1. img
  2. a
  3. div
  4. body
  5. html
  6. document object

活动委托是倾听父母意见的技巧(比如<div>)用于一堆事件处理程序而不是您关心的特定元素(例如<img>)。事件对象将有一个 target 属性,该属性指向事件起源的特定 dom 元素(在本例中<img>).

您的事件委托代码可能如下所示:

$(document).ready(function(){
    $('<div>').on('click', function(e) {
        // check if e.target is an img tag
        // do whatever in response to the image being clicked
    });
});

欲了解更多信息,请查看戴夫沃尔什的关于活动委托的博客文章 http://davidwalsh.name/event-delegate或duckduckgo“事件委托”。

OP 中代码示例的注释:在第一个例子中,target.hasClass('editable')意味着单击的特定事物必须具有可编辑的类才能执行 if 块。正如一位评论者指出的那样,这可能不是您想要的。您可能想尝试以下方法:

$(document).on('click', function(e) {
   if ($(e.target).parents(".editable").length) {
       // Do whatever
   }
});

让我们稍微分解一下:

  • $(e.target)- 页面上单击的任何内容都会转换为 jQuery
  • .parents(".editable")- 找到单击的元素的所有祖先,然后过滤以仅包含“可编辑”类的元素
  • .length- 这应该是一个整数。如果为 0,则表示没有“可编辑”类的父级
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在何处添加事件侦听器的最佳实践 的相关文章

随机推荐

  • 在struts中从Angular 2发送和接收http post数据

    我正在尝试将 http post 数据从 Angular 4 代码发送到 struts 操作 Struts 操作正在被调用 但无法接收数据 给我一个错误 java lang ClassCastException java lang Inte
  • 使用 Swift 将 NSHttpCookie 存储在 iOS 钥匙串中

    我有一个以 HTTP cookie 形式从 Web 服务收到的身份验证令牌 目前 我依赖于 iOS 的默认行为 即将从 HTTP 请求返回的 cookie 存储在NSHTTPCookieStorage保留 cookie 直到用户关闭应用程序
  • 模型和实体有什么区别[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很困惑不明白这句话的含义 Entity Model DataModel ViewModel 任何人都可以帮助我理解它们吗 这些术语的
  • 使用正则表达式获取 DIV 内容

    如何使用正则表达式获取 DIV 的内容 我需要得到的是介于两者之间的 div class lv1right dfbg div 这些 div 标签之间还有几个 未明确定义的 标签 我想获取所有这些标签 提前致谢 我会避免对 HTML 使用正则
  • 如何在 Ruby 中获取 Linux 系统信息

    如何在 Ruby 中获取 Linux 系统的软件 硬件信息 这必须适用于 Fedora Ubuntu 等 Chef 背后的优秀人员 拥有一颗名为 Ohai 的优秀宝石https github com opscode ohai https g
  • 这个“ld”错误(“未定义的引用”)是什么意思?

    这个错误是什么意思 tmp ccevEqoI o In function main funcptr c text 0x61 undefined reference to AddALL collect2 ld returned 1 exit
  • GD库占用内存大吗?

    我想在我的 PHP 脚本中使用 GD 库从外部服务器生成随机大图片的小缩略图 每次调用页面时 GD库都会重新生成缩略图并显示 这会减慢服务器速度或消耗异常数量的内存吗 GD使用大量内存 它将图像完全加载到内存中并将其解压缩 因此每个像素至少
  • 什么是 Windows Phone Silverlight 8.1 中作为后台任务的 gHost.Background 任务?

    当我创建新的 Windows Phone SIlverlight 8 1 应用程序时 清单中有一个后台任务
  • RichFaces 4.2 日历。如何通过JavaScript设置日历的InputField?

    我必须将客户端的日期字符串复制到日历输入字段 更新日期输入 以下 JavaScript 不起作用 document getElementById AddressDetails renewal date input value renewal
  • Jquery国际电话号码输入

    我正在尝试遵循 jquery 教程http www jqueryscript net form jQuery International Telephone Input With Flags Dial Codes html http www
  • 在现有 S3 对象上运行 S3-put-triggered Lambda 函数?

    我在 Node js 中有一个 Lambda 函数 用于处理添加到我的存储桶中的新图像 我想为所有现有对象运行该函数 我怎样才能做到这一点 我认为最简单的方法是 重新放置 每个对象 以触发该功能 但我不确定如何执行此操作 需要明确的是 我想
  • 正确分发带有数据库的 Java 应用程序

    我有一个 Java 应用程序 它使用我想要分发的 MySql 数据库 我担心的是 为了分发此应用程序 我需要假设目标系统同时安装了 JRE 和 MySql Server 有什么方法可以将我的应用程序与 JRE 和 MySql 服务器捆绑在一
  • Google Analytics 事件跟踪 - 最大字符串长度

    我正在使用 Google Analytics 来跟踪 Android 应用程序中的事件 我的问题是 事件中的字符串长度是否有限制 我在谷歌的开发指南网站上没有找到任何关于这个主题的信息 此致 Edit 我尝试了一个包含 2000 个字符的字
  • 在 http.Handler ServeHTTP 函数中计算 Go 中发送和接收的字节数?

    如何计算发送和接收的字节数ServeHTTPGo 中的函数 计数需要相对准确 跳过连接建立并不理想 但可以接受 但必须包含标题 它还需要很快 迭代通常太慢 计数本身不需要发生在ServeHTTP 只要给定连接的计数可用于ServeHTTP
  • Python requests.exception.ConnectionError:连接中止“BadStatusLine”

    我正在尝试使用 Python requests 模块发出 Http GET 命令来访问一些基于 REST 的 API 这些 url 在 RESTClient 上工作正常 但是当我在 python 中使用相同的 url 时 出现连接错误 我试
  • 设备像素比到底是什么?

    每一篇关于移动网络的文章都提到了这一点 但我找不到任何地方可以解释这个属性到底衡量什么 任何人都可以详细说明这样的查询会检查什么吗 media only screen and webkit min device pixel ratio 1
  • BDD 和 Behat 特殊字符

    有类似的问题 Behat 和输入验证场景中的 Gherkin https stackoverflow com questions 6561815 gherkin in behat and input validations scenario
  • 获取当前剪贴板内容? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道一种方法 让我的脚本检测剪贴板的内容 并在页面打开时将其粘贴到文本字段中 而无需用户输入 如何做呢 请注意 此解决方案在 Fi
  • CallKit 查找用于从本机电话应用程序启动应用程序的号码

    我已经在我们的应用程序中实现了 CallKit 我们的应用程序拨打的电话显示在本机电话应用程序的最近通话列表中 当点击最近列表中我们的应用程序的条目时 我们的应用程序就会启动 有没有办法找出哪个数字 条目 用于启动我们的应用程序 openU
  • 在何处添加事件侦听器的最佳实践

    在我的页面上 用户单击一个元素以对其进行编辑 为了促进这一点 我分配了班级editable所有这些元素 我应该如何监听所有这些元素的点击 目前 我正在这样做 document body addEventListener click even