事件绑定方法和性能 $(document).on("click", "#id", fn) VS $("#id").on("click", fn)

Event Binding Methods & Performance $(document).on("click", "#id", fn) VS $("#id").on("click", fn)

以下哪一项在性能等方面更好,为什么?

1. `$(document).on("click", "#id", function (e) {   });` 
 
2. `$("#id").on("click", function (e) {   })`
   
3. `$("#id").die('click').live("click",function(e){ });`

4. `$("#id").live("click",function(e){ });`

如果我们使用事件委托,对性能有什么影响?我正在寻找深入的解释。

请忽略最后两个样本。因为那些已经死了。对于前两个示例,可以根据您正在编码的上下文来决定。第一个是 event delegation。因此您可以在处理 运行 期间创建的元素时使用它。在使用事件委托期间,必须提供直接静态父代来代替 document 以提高性能。第二个示例是一个普通示例,但在处理动态元素时无法合并。也许您可以在将动态元素插入 DOM 之后使用它。但首选事件委托。

$(document).on("click", "#id", function (e) {   });

最理想

TLTR 以上所有指定方法的解释如下。

  1. $(document).on("click", "#id", function (e) { });

这种绑定事件的方式,称为 event delegation,在文档或静态父元素(比如 body)上,而不是在动态 [= 的情况下完成特定的特定元素52=] 操纵。一个很好的例子是,想一想你想将事件绑定到 DOM 元素的情况,该元素在页面加载时可能不存在,但稍后会被引入 DOM通过远程加载或通过动态 DOM 操作分阶段。如果在 DOM 中引入新元素后立即为新引入的元素绑定事件,您的代码将不会整洁。所以在这种情况下,我们使用上面的方法来初始绑定事件,这样我们就不必担心绑定时元素是否存在。这里点击事件绑定到文档,然后委托给指定的元素。由于这是绑定到文档或静态父级,因此与第二种方法相比,事件传播时间会更长,即事件传播会很慢But this is the preferred way of doing it.

  1. $("#id").on("click", function (e) { })

这种绑定用于 DOM 不需要是静态的,但您指定的元素在您绑定事件时已经存在的情况。通常我们在静态 DOM 元素情况下这样做。唯一的问题是,只有当事件必须绑定到的特定元素已经存在于 DOM 中时,才能使用这种绑定。由于这是直接绑定并且不涉及任何委托 与方法 1 相比,事件传播将更快

Since the first kind of binding is done on the document, it will be slow compared to the second one in which event is directly binded onto the specific element.

  1. $("#id").die('click').live("click",function(e){ });
  2. $("#id").live("click",function(e){ }); 已在 jQuery 1.7 中弃用 并在 jQuery 1.9.
  3. 中删除

"Since all .live() events are attached at the document element, events take the longest and slowest possible path before they are handled." - Quoted from https://api.jquery.com/live/.

这是您问题的答案,哪种方法更快?

Method 2 > Method 1 > Method 3 & 4

Method 1 仍然是首选方法。