在jQuery中使用live而不是bind会对性能产生影响吗?

我发现了一些关于livebind ,但没有一个是关于性能的。 我认为标题很清楚,在jQuery中使用live会有性能影响吗? 为什么我要问这是因为在使用live时每次事件被触发时都必须进行查找,我的想法是这可能会以负面的方式影响性能。 或者jQuery正在做一些加速这个的神奇的东西,比如听一些东西被添加到DOM时被触发的事件?

通常,当您的站点上有许多(…)元素需要具有事件处理程序时,使用.live() .delegate()具有更好的整体性能。

将50x事件处理程序绑定到50个不同节点比将这些事件处理程序绑定到这50个元素的公共父级(基本上就是.live()所做的那样)的成本更高。

现在有人可能会争辩说,“好吧,很棒,但这会带来头顶事件冒泡”,这绝对是正确的。 这就是为什么.delegate()被引入的原因。 .live()总是将处理程序绑定到document.body ,它显然是标记中任何子节点的父级。 然而, .delegate()接受一个参数,您可以在其中指定“最小公分母”,这意味着您希望拥有事件处理程序的那些元素共享的最近父节点。 这实际上将开销减少到零。

我不得不承认,我从来没有基准(但)在哪一点上使用“实时绑定”是有意义的。 但是,一旦你有多个元素绑定处理程序,它就有意义了。 只有一个function而不是N的事实对我来说似乎很方便。

从记忆的角度来看, live表现更好。 bind必须将相同的事件附加到目标选择中的每个项目。

从实际的性能角度来看, live检查有很小的开销,但这应该可以忽略不计。

这是一种非常简化的类似live的方法:

 function live(event, selector, callback) { $(document).bind(event, function () { if ($(this).is(selector)) { return callback(); } }); } 

.live的工作方式是:将事件绑定到其中一个父节点。 所以实际上每次触发事件时都没有查找,但是这个方法的代价是支持较少但是IE。 我建议你坚持使用.bind 。 如果必须将事件绑定到许多元素,请使用.delegate方法。

jQuery文档准确解释了它的工作原理:

事件委派.live()方法能够通过使用事件委托来影响尚未添加到DOM的元素:绑定到祖先元素的处理程序负责在其后代上触发的事件。 传递给.live()的处理程序永远不会绑定到元素; 相反,.live()将一个特殊的处理程序绑定到DOM树的根。 在我们的示例中,单击新元素时,会发生以下步骤:

  1. 生成单击事件并将其传递给for处理。
  2. 没有处理程序直接绑定到,所以事件冒泡DOM树。
  3. 事件会一直冒泡,直到它到达树的根,这是默认情况下.live()绑定其特殊处理程序的地方。
    • 从jQuery 1.4开始,事件冒泡可以选择在DOM元素“context”处停止。
  4. 由.live()绑定的特殊单击处理程序执行。
  5. 此处理程序测试事件对象的目标以查看它是否应该继续。 通过检查$(event.target).closest(’。clickme’)是否能够找到匹配的元素来执行此测试。
  6. 如果找到匹配元素,则在其上调用原始处理程序。

因为在事件发生之前不执行步骤5中的测试,所以可以随时添加元素并仍然响应事件。

所以,你说的第一件事。 它会检查事件发生的时间。