• 哪个更快?document.addEventListener VS element.addEventListener


    问题描述:

    在创建网页的时候,我有一个困惑,我注意到有很多元素等待点击,所以我想问:哪种做法对性能更好?
    为文档添加事件侦听器,然后检查我单击的元素的类或 id:

    1. document.addEventListener('click', e => {
    2. let element = e.target.id;
    3. if(element === navbarBtn) /* do something */;
    4. if(element === goUpBtn) /* do something */;
    5. if(element === darkModeSwitcherBtn) /* do something */;
    6. })


    为我将单击的每个元素添加事件侦听器:

    1. navbarBtn.addEventListener('click', () => {
    2. // doing something
    3. })
    4. goUpBtn.addEventListener('click', () => {
    5. // doing something
    6. })
    7. darkModeSwitcherBtn.addEventListener('click', () => {
    8. // doing something
    9. })

    解决思路一:

    这里的另一个人给了你一个解决方案来找出哪个更快,但我会采取不同的方向,因为我认为你误解了你真正应该寻找的东西。后者几乎肯定会更好,不管你能找到什么小的性能差距。这有几个关键原因:

    • 阅读之前的代码,我问自己当这个事件触发时会发生什么?答案是我不知道,同一个函数中发生了太多事情。要调试此事件,我需要弄清楚哪个案例甚至失败以及触发它的原因。从节省开发人员在解决方案上花费的时间的角度来看,这是低效的。

    • 如果您使用前一种解决方案,如果用户单击的不是 navBarBtn、goUpBtn 或 darkModeSwitcherBtn 会发生什么?您可能想象的答案是事件触发并检查每个条件,这再次使代码容易发生奇怪的交互,特别是如果您稍后添加其他事件。此外,从性能的角度来看,这也很糟糕,因为您正在不必要地调用函数和检查条件。

    • 存在标准解决方案,它是为您需要事件的每个元素添加一个事件侦听器。这是一个非常常见的约定,您应该尽可能地遵守它,如果有的话只是因为它是其他人所期望的,以及您将在野外发现的其他代码将如何运行。必要时肯定有打破约定的空间,但是遵循这样的约定将使您在以后的阶段更容易使用其他人的代码。

    简而言之,性能在这个问题上是一个红鲱鱼,并且是过早优化的一个非常明显的例子。这实际上不是您在这里应该关心的,因为与您可能不得不调试尝试做太多事情的函数相比,它对整体性能的影响非常小。

    解决思路二:

    这实际上取决于您如何定义better,因为它非常主观。

    您绝对不想做的一件事是,每次有人单击您页面上的某些内容时都运行您的函数。这是非常低效的,好的代码是高效的代码。

    从可读性的角度来看,您想要应用到按钮的功能也附加到该按钮上,这一点也更加清晰。如果您将所有内容都附加到 with 子句中,那么以后将eventListeners一场document噩梦switch

    从性能的角度来看,嗯。我想会document稍微快一点,这只是由于 DOM 的工作方式、冒泡等原因,但是节省的时间(可能是 1 毫秒)将立即用于元素检查。

    坚持eventListeners在你正在使用的元素上使用,除非你绝对需要它在父元素上以利用事件委托,在这种情况下,它应该尽可能接近需要委托的元素。

    解决思路三:

    以上仅为部分解决思路,添加下方公众号后回复001,即可查看全部内容。公众号有许多评分最高的编程书籍和资讯,无套路,可放心使用

    如果您觉得有帮助,可以关注公众号——立志于成为对程序员有益的公众号

  • 相关阅读:
    DownloadingImages 下载缓存图片,显示图片文字列表
    《C++ Primer Plus》第九章:内存模型和名称空间(2)
    Spring封装的原生WebSocket使用,带组的实现
    四大步骤教你发布新闻源软文,媒介盒子无偿分享
    实习记录--(海量数据如何判重?)--每天都要保持学习状态和专注的状态啊!!!---你的未来值得你去奋斗
    统一身份认证登录详细介绍-identity4
    一句话的需求怎么测?需求文档的三种现状及应对策略
    小解C语言文件编译过程【linux】
    2022年春季学期新疆电大一体化科学与技术第1次作业-1【标准答案】
    计算机毕业设计django基于python网上拍卖系统
  • 原文地址:https://blog.csdn.net/qq_38334677/article/details/126150889