Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加太多事件侦听器是否会影响性能?_Javascript_Jquery_Events_Actionlistener_Onclicklistener - Fatal编程技术网

Javascript 添加太多事件侦听器是否会影响性能?

Javascript 添加太多事件侦听器是否会影响性能?,javascript,jquery,events,actionlistener,onclicklistener,Javascript,Jquery,Events,Actionlistener,Onclicklistener,我有一个关于javascript(jQuery)事件/侦听器的一般性问题。 没有性能问题的单击侦听器的数量有限制吗?就性能而言,事件绑定到的元素的数量是您看到任何问题的地方 这是一本书。您将看到绑定到许多元素的速度要慢得多,即使在每种情况下只绑定一个事件 jsperf中的第三个测试展示了如何将事件绑定到父元素,并使用委托来侦听所需的元素。(在本例中为.many) n、 b.测试表明第三个选项是最快的,但这是因为它的目标元素是id,而不是类 更新:下面是另一个显示绑定到id的3个事件与使用类绑定的

我有一个关于javascript(jQuery)事件/侦听器的一般性问题。
没有性能问题的单击侦听器的数量有限制吗?

就性能而言,事件绑定到的元素的数量是您看到任何问题的地方

这是一本书。您将看到绑定到许多元素的速度要慢得多,即使在每种情况下只绑定一个事件

jsperf中的第三个测试展示了如何将事件绑定到父元素,并使用委托来侦听所需的元素。(在本例中为
.many

n、 b.测试表明第三个选项是最快的,但这是因为它的目标元素是
id
,而不是类


更新:下面是另一个显示绑定到
id
的3个事件与使用
类绑定的一个事件的对比。虽然这是一个老问题,但我觉得还没有完全回答

正如所指出的:在哪里添加事件处理程序已经很重要了。 但最初的问题似乎更关心触发这些事件处理程序(例如单击或滚动事件)对性能的影响

是的,向元素添加额外的事件处理程序会降低性能。 下面是测试以下情况的性能比较:

结果
  • 一个
    具有10个
    处理程序,而
    click
    事件由jQuery触发
    → 每秒72.000次点击
  • 一个
    具有100
    单击
    处理程序,而
    单击
    事件由jQuery触发
    → 59.000次点击/秒—比第一种情况慢19%
    这表明,额外的事件处理程序会降低执行速度
  • 一个
    具有10个
    处理程序,而
    click
    事件由普通JS触发
    → 每秒点击84.000次,比第一种情况快6%
    使用普通JS比使用jQuery快一点
  • 一个
    100个
    处理程序,而
    click
    事件由普通JS触发
    → 每秒点击14.000次,比第二种情况慢77%
    这很有趣:当使用本机事件时,侦听器的数量似乎比使用jQuery更快地降低性能
  • (每次跑步的结果都会有所不同,这在很大程度上取决于您的硬件和浏览器)

    请记住,这些测试是使用空函数完成的。当添加执行一些额外任务的实函数时,性能将进一步降低

    下面是第二个测试,它会在每次单击时更改div的内容:

    慢吗? 另一方面,即使每秒执行100次操作也非常快(这意味着每个事件处理程序在一秒钟内执行100次),并且没有用户会注意到延迟

    我认为您不会遇到用户操作事件(如
    单击
    鼠标指针
    处理程序)的问题,但在使用快速触发的事件(如
    滚动
    鼠标指针
    )时需要小心


    此外,随着计算机速度的提高和浏览器应用越来越多的优化,事件处理程序的数量“太多”并没有硬性限制。它不仅取决于调用的函数和观察到的事件,还取决于用户的设备和浏览器。

    确实需要更多的内容。单击处理程序不会给您带来性能问题,单击时采取的操作“可能”会导致问题。而且,一次点击可以绑定到1个元素,或者20000个元素,所以需要更多的信息。这就是我的意思。整个应用程序都必须听它。我说的是5-20点击监听器。我不知道这是否是一个问题,这就是为什么我要问:)这里是对绑定到一个或多个元素的click事件的测试,您将看到,即使只绑定了一个事件,但与该选择匹配的元素数的影响更大。因此,这将对性能的影响远远超过事件的数量。测试(刚刚更新)还显示了如何绑定到父级,以提高绑定到许多元素的性能。(在这里计算最快,因为它是一个
    id
    我正在检查我是否理解你。因此,如果我将10个侦听器放在10个不同的元素上,比将一个侦听器放在具有相同类的10个元素上要少一些性能问题?更多的是关于元素的数量和如何选择它们,而不是添加事件本身。也就是说,这表明adding 3使用
    id
    将事件单独添加到元素中的速度与使用
    class
    添加一个事件的速度差不多,因此添加事件不会真正影响性能,而是影响获取元素的方式(以及元素的数量)这很有效谢谢你的答案@atmd-这个问题也很好地证明了我的答案。一般来说,如果你使用jQuery,在使用
    $(元素)时,尝试支持委托的额外参数。on()
    …因此代替$('ul li')。on('click',callback)`使用
    $('ul')。on('click',li',callback
    。我认为您的测量值与实际问题(正如我所读到的)是相切的与其测量绑定较少/较多的应用程序的性能,不如首先测量设置绑定的成本。jsperf自一年以来一直在下降,最好使用现有的性能测试更新答案,以说明answerjsperf在此处工作良好。无需更新答案。