为什么在jquery中将事件注册到文档是不好的做法?

时间:2016-03-30 12:30:33

标签: javascript jquery javascript-events

每当我读到jquery中的事件注册时,他们都会说我们应该尝试将事件处理程序添加到最近的父级,并避免向文档添加事件侦听器,因为根据资源它们很慢且效率不高。

但为什么他们很慢?显然,这是因为事件必须冒泡到文档,这需要时间。然后将它与要调用的选择器列表进行比较,例如

$(document).on("click", ".abc", function(){  })
$(document).on("click", ".abc2", function(){ })

所以这里如果我单击一个元素,click事件将冒泡到文档然后它将匹配选择器列表(“。abc,.abc2”)......这是低效的。好的我明白了,但如果我在列表中只有一个选择器呢? e.g。

$(document).on("click", "*", function(){  }) 

它会慢吗?如果是这样的话?

基本上我正在尝试创建一个google的jsaction similer lib,所以我会这样写: -

$(document).on("click", "[jsaction]", function(){  })

因为这将是唯一的选择器,所以我认为它不会很慢?还是会呢?

如果将事件附加到文档效率不高,那么完全ajax应用程序呢?我的应用程序完全是ajax,每个页面都将由ajax下载。还有其他更有效的解决方案吗?

1 个答案:

答案 0 :(得分:1)

事件委托基本上使用2个不同的过程,

  1. 事件冒泡,例如,当您点击某个元素时 活动将被冒泡到文件中以解雇相关事件。
  2. 匹配,在到达文档后(在事件冒泡期间) 导致事件冒泡的人将会被证实 随附文档的选择器。如果匹配则相关 活动将被解雇。
  3. 因此,您通过声明通用选择器来倡导匹配。坦率地说,匹配2或3个元素将比在事件冒泡期间遍历文档花费更少的时间。在这种情况下,如果您使用静态最接近的父级而不是document,则遍历时间将减少,这将提高性能。

    虽然匹配花费的时间较少,但是当它有15个以上的匹配元素时,即使使用最近的父代替document,也会影响性能。

    总而言之,我们必须通过了解上述两个不同的过程,在常识下谨慎地使用事件委派。