Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.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和jQuery中使用委托事件处理程序是否存在性能缺陷?_Javascript_Jquery_Performance_Dom - Fatal编程技术网

在JavaScript和jQuery中使用委托事件处理程序是否存在性能缺陷?

在JavaScript和jQuery中使用委托事件处理程序是否存在性能缺陷?,javascript,jquery,performance,dom,Javascript,Jquery,Performance,Dom,我在JavaScript代码中使用委托事件处理程序(jQuery),因此当单击动态添加的按钮时会发生一些事情 我想知道这有没有性能缺陷 // Delegated event handler $(document).on('click', '#dynamicallyAddedButton', function(){ console.log("Hello"); }); 与此相比,它的性能如何 // Regular event handler $("#regul

我在JavaScript代码中使用委托事件处理程序(jQuery),因此当单击动态添加的按钮时会发生一些事情

我想知道这有没有性能缺陷

// Delegated event handler
$(document).on('click', '#dynamicallyAddedButton', function(){
    console.log("Hello");
});
与此相比,它的性能如何

// Regular event handler
$("#regularButton").on('click', function(){
    console.log("Hello Again");
});
看看这些事件,似乎事件总是在DOM树上一路冒泡。这是否意味着元素嵌套得越深,事件工作的时间就越长


编辑:是问了一个类似的问题,答案是有用的。我想知道使用常规事件处理程序和委托事件处理程序之间有什么区别。这些相互关联的问题使得DOM树上的事件不断涌现。使用委派的事件处理程序,事件是否会向上冒泡,然后再向下冒泡到指定的元素?

每次单击文档中几乎任何位置时,事件都会手动冒泡到
文档
元素(在自然冒泡发生后)并将为单击的元素和
文档之间的每个元素运行选择器引擎

因此,如果单击嵌套了20个元素的元素,选择器引擎将为该单击运行20次

此外,
文档
中的每个选择器都会出现这种情况。因此,如果你给它20个选择器,并点击20个元素的深度,选择器引擎必须运行400次。(当然,手动起泡只发生一次。)


基于选择器的委派可以,但如果可能,请尽量使其靠近目标元素。

可以,但不会以任何明显的方式进行,除非您有数百个委派事件处理程序和极其复杂的标记。可能重复。另外,@CBroe:我认为这不是一个好的复制品。他问的是jQuery的系统,它的开销比典型的目标事件委派要大得多。好吧,接着说我提到的最后一个,有点,但这一个是关于jQuery委派与jQuery直接绑定的比较。第一个是比较jQuery和no-jQuery。答案将涉及类似的信息。我猜是判断调用。那么,对于委托事件处理程序,它是否必须向上冒泡,然后向下冒泡到指定的元素?奇怪的是,如果每次单击事件都会冒泡到顶部,那么动态添加的元素就不能有常规的事件处理程序。@jabeoogie:它们可以有常规的处理程序,但在创建时需要手动分配它们。依我看,这不是个坏主意。或者我误解了你的意思了吗?总而言之,“冒泡”的发生与分配的任何处理程序无关。它实际上从顶部开始,然后首先进入
事件。target
。这被称为“捕获”阶段。然后它会冒出气泡回到顶部。这是冒泡阶段。这就是jQuery绑定处理程序被激发的地方。然后,jQuery手动从
事件.target
开始,并针对循环中的当前元素测试选择器,向上遍历
.parentNode
直到到达原始绑定元素。