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

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

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

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

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

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

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

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

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

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

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

事件委托主要使用2个不同的过程,

  1. 冒泡的事件 ,例如,当您点击一个元素时,该事件将被冒泡到文档以触发相关事件。
  2. 在到达文档之后(在事件冒泡期间) 匹配导致事件冒泡的人将通过附有文档的选择器进行validation。 如果匹配,则将触发相关事件。

因此,您通过声明通用选择器来提倡匹配 。 坦率地说,匹配2或3个元素将比在事件冒泡期间遍历文档花费更少的时间。 在这种情况下,如果您使用静态最接近的父级而不是document ,则遍历时间将减少,这将提高性能。

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

因此,总结是,我们必须通过了解上述两个不同的过程在发动机罩下进行,谨慎地使用常识。