2011-06-17 30 views
1

我正在考虑使用live()将事件处理程序绑定到我没有插入到DOM中的函数。然而,这看起来很昂贵 - 每次插入元素或任何时候执行“click”元素时,都必须执行运行时检查,例如,查看是否应该调用处理程序。jQuery live()事件处理程序的性能

这是值得在实践中担心的事情,还是Javascript现在如此之快,这是不值得关心?

live()功能参考页:http://api.jquery.com/live/

回答

6

没有,.live()使用事件冒泡做它的事。它只是附加到根元素,并对在DOM树中冒泡的事件作出反应。它不会而不是始终检查DOM元素。

从一页面链接到:

.live()方法能够影响尚未通过使用事件代表团添加到DOM元素:绑定到一个祖先元素的处理程序负责其后代触发的事件。传递给.live()的处理程序永远不会绑定到一个元素;相反,.live()将特殊处理程序绑定到DOM树的根。

保持阅读,因为它进入更多的细节。

+0

很好的解释。 – kinakuta 2011-06-17 07:46:45

+0

所以这个想法是,如果我点击一个没有'click'处理程序的元素,那么这个事件会冒出DOM,直到jQuery能够找到一个'click'事件处理程序? – 2011-06-17 17:04:59

+0

@Kevin不完全。所有事件都会在DOM树中冒泡并沿途触发所有匹配的事件处理程序。即如果'

'中的每个'div'都有'onclick'处理程序,则点击链接时将按顺序执行所有操作。这是标准的DOM行为,而不是jQuery。 '.live()'只是“等待”最顶层的元素来接收所有'click'事件。当它这样做时,它会检查最初点击的元素是否与你的选择器匹配,如果是,则调用你的事件处理函数。 – deceze 2011-06-18 03:36:38

2

使用delegate()可能会更好,它不会在文档上附加处理程序,而会在指定的父元素上附加。这意味着更少的负载。建议在大多数情况下使用它而不是.live()

About the differences on Nettuts+

+0

如果需要,您可以将'.live()'附加到特定的*上下文*而不是根元素。 – deceze 2011-06-17 07:50:05

+1

@deceze你会怎么做,更重要的是,为什么? “.delegate()”接口通常比“.live()”更聪明,主要是因为不需要构建初始jQuery对象。 (*编辑*哦,我看,如果你用上下文构建jQuery对象,那么它会使用它。但是,它不必要地遍历DOM的至少一部分来构建通常不被使用的元素列表。) – Pointy 2011-06-17 07:55:01

+1

引用文档:'$(“。clickme”,$(“#container”)[0])。live(...)'。我并不是说'.delegate'不好,只是你可以优化'.live'。 – deceze 2011-06-17 07:57:05