我正在考虑使用live()
将事件处理程序绑定到我没有插入到DOM中的函数。然而,这看起来很昂贵 - 每次插入元素或任何时候执行“click”元素时,都必须执行运行时检查,例如,查看是否应该调用处理程序。jQuery live()事件处理程序的性能
这是值得在实践中担心的事情,还是Javascript现在如此之快,这是不值得关心?
为live()
功能参考页:http://api.jquery.com/live/
我正在考虑使用live()
将事件处理程序绑定到我没有插入到DOM中的函数。然而,这看起来很昂贵 - 每次插入元素或任何时候执行“click”元素时,都必须执行运行时检查,例如,查看是否应该调用处理程序。jQuery live()事件处理程序的性能
这是值得在实践中担心的事情,还是Javascript现在如此之快,这是不值得关心?
为live()
功能参考页:http://api.jquery.com/live/
没有,.live()
使用事件冒泡做它的事。它只是附加到根元素,并对在DOM树中冒泡的事件作出反应。它不会而不是始终检查DOM元素。
从一页面链接到:
的
.live()
方法能够影响尚未通过使用事件代表团添加到DOM元素:绑定到一个祖先元素的处理程序负责其后代触发的事件。传递给.live()
的处理程序永远不会绑定到一个元素;相反,.live()
将特殊处理程序绑定到DOM树的根。
保持阅读,因为它进入更多的细节。
使用delegate()
可能会更好,它不会在文档上附加处理程序,而会在指定的父元素上附加。这意味着更少的负载。建议在大多数情况下使用它而不是.live()
。
如果需要,您可以将'.live()'附加到特定的*上下文*而不是根元素。 – deceze 2011-06-17 07:50:05
@deceze你会怎么做,更重要的是,为什么? “.delegate()”接口通常比“.live()”更聪明,主要是因为不需要构建初始jQuery对象。 (*编辑*哦,我看,如果你用上下文构建jQuery对象,那么它会使用它。但是,它不必要地遍历DOM的至少一部分来构建通常不被使用的元素列表。) – Pointy 2011-06-17 07:55:01
引用文档:'$(“。clickme”,$(“#container”)[0])。live(...)'。我并不是说'.delegate'不好,只是你可以优化'.live'。 – deceze 2011-06-17 07:57:05
很好的解释。 – kinakuta 2011-06-17 07:46:45
所以这个想法是,如果我点击一个没有'click'处理程序的元素,那么这个事件会冒出DOM,直到jQuery能够找到一个'click'事件处理程序? – 2011-06-17 17:04:59
@Kevin不完全。所有事件都会在DOM树中冒泡并沿途触发所有匹配的事件处理程序。即如果'