对于某些元素,只要将鼠标悬停在它们上面,我希望元素变大,然后在取消悬停时缩小。所以我只使用$('.elementClass').hover(function() { enlarge(this); }, function() { shrink(this); });
。我把它放在所有网页的$(function() { });
区域,因为许多网页都有这些元素。
有时我需要创建新的动态元素,并且它们具有上述元素。当然,我必须再次为他们调用上面的悬停功能,因为它们最初并不存在。
最方便的是在每个网页上简单地调用$('.variousClasses').live('variousEvents', function() { });
个电话,以获得上述所有可能的功能。
所以问题是,即使对那些不会触发那些永远不会存在的事件或元素的元素,调用live()
这么多次会有性能损失吗?我需要注意的是,只在需要时才调用hover()
或live('hover')
(和其他事件) 这一点很重要吗?
答案 0 :(得分:2)
作为对您的问题的一般回答,您应该尝试最小化无关的函数调用 - 在动态内容情况下可能更多。
特别是,live()
是用于此问题的一个很好的例子,因为它确实带有一些(可能)显着的性能并发症。当您调用live()
时,jQuery会将您选择的事件绑定到document
对象。这意味着每次触发事件时,它都会从origin元素冒泡到document
对象。根据您的网站结构(以及一般情况而定),这可能会很昂贵。
delegate()
最好使用jQuery的delegate()
函数,特别是如果你有一个预定义的父容器元素,你的所有事件都将被触发。当您使用delegate()
时,您基本上使用live()
的受限版本,以便事件仅传播到指定的父元素。因此,您可以避免在您不关心的元素上发生许多可能代价高昂的事件。
在您的情况下,由于您正在使用动态生成的内容,您必须使用上述函数或设置代码,以便在将元素插入DOM时,它还会将事件处理程序绑定到它。前者可能更容易,但后者可以提供稍微(可能难以辨认)更好的表现。