jQuery的live()函数的性能损失

时间:2011-09-12 01:47:04

标签: javascript javascript-events jquery

对于某些元素,只要将鼠标悬停在它们上面,我希望元素变大,然后在取消悬停时缩小。所以我只使用$('.elementClass').hover(function() { enlarge(this); }, function() { shrink(this); });。我把它放在所有网页的$(function() { });区域,因为许多网页都有这些元素。

有时我需要创建新的动态元素,并且它们具有上述元素。当然,我必须再次为他们调用上面的悬停功能,因为它们最初并不存在。

最方便的是在每个网页上简单地调用$('.variousClasses').live('variousEvents', function() { });个电话,以获得上述所有可能的功能。

所以问题是,即使对那些不会触发那些永远不会存在的事件或元素的元素,调用live()这么多次会有性能损失吗?我需要注意的是,只在需要时才调用hover()live('hover')(和其他事件) 这一点很重要吗?

1 个答案:

答案 0 :(得分:2)

作为对您的问题的一般回答,您应该尝试最小化无关的函数调用 - 在动态内容情况下可能更多。

特别是,live()是用于此问题的一个很好的例子,因为它确实带有一些(可能)显着的性能并发症。当您调用live()时,jQuery会将您选择的事件绑定到document对象。这意味着每次触发事件时,它都会从origin元素冒泡到document对象。根据您的网站结构(以及一般情况而定),这可能会很昂贵。

使用delegate()

的更好选择

最好使用jQuery的delegate()函数,特别是如果你有一个预定义的父容器元素,你的所有事件都将被触发。当您使用delegate()时,您基本上使用live()的受限版本,以便事件仅传播到指定的父元素。因此,您可以避免在您不关心的元素上发生许多可能代价高昂的事件。

在您的情况下,由于您正在使用动态生成的内容,您必须使用上述函数或设置代码,以便在将元素插入DOM时,它还会将事件处理程序绑定到它。前者可能更容易,但后者可以提供稍微(可能难以辨认)更好的表现。