繁体   English   中英

对于独特的dom元素,总是使用live()而不是bind()的缺点?

[英]Drawbacks to always using live() instead of bind() for unique dom elements?

在编写jQuery绑定事件时,我通常使用bind( )别名( click()submit()等)。

但是,我使用动态生成的内容越多,我发现它越不明确,什么时候bind()不起作用,最后调试半小时,直到我尝试live()并且它的工作原理。

在ID选择器的参数内(例如' #foo ',而不是.classes或元素('input') ):

除了缺少方便的别名之外,总是使用live()而不是bind()这些类型的绑定是否有任何缺点,因为只有一个DOM元素绑定到特定的ID?

===========

编辑:我不是bind()live()之间有什么区别; 这已被覆盖。 我问的是,默认情况下使用live()有什么缺点,因为诱惑是在你不能错误地选择的情况下(即当你使用#uniqueDomElement )这样做,并且避免考虑当bind()不合适时。

.live()的主要缺点是权重(这在使用大量.live()处理程序时适用),因为它默认情况下将事件处理程序附加到document和事件(它的工作原理的整个基础)这意味着当事件到达文档时,必须检查一些事情:

  • 我有这个事件类型的任何.live()事件吗?
  • 如果我这样做,事件来自哪个元素是否匹配那些.live()处理程序的任何选择器?

第一个是相当便宜,第二个不是。 我们来看一下最常见的例子,即click事件。 click事件泡沫,到目前为止一切都很好。 比方说,我们有一个或多个.live()事件处理程序的click上注册的document ...现在我们通过所有这些处理器都具有循环和他们的选择比较的情况下从, 你拥有的越多处理器附带的元素这会得到更多 ,并且每次点击 都会发生,这是迄今为止对.live()的最大性能损失。

还有其他问题,例如附加/删除处理程序,但管理处理程序......当你有大量处理程序时,上面的性能问题是将它与直接.bind()进行比较时的主要问题.bind()打电话。

你在bind中遇到的问题是你必须在元素出现在页面上之后调用bind。通常人们会在文档就绪上调用bind,以便它们可以将行为附加到页面上的元素。 如果在之后通过javascript将一个元素添加到页面中,则需要对添加的新元素应用相同的绑定调用,这通常很麻烦,因此您可以使用.live。

.live使用事件委托,这意味着jquery不是将一个函数处理程序绑定到页面上的特定元素,而是管理所有不同的实时调用,这样当你进行某种实际处理程序的操作时,它将检查是否存在你执行该操作的元素匹配给定的选择器(我相信这是它的工作原理)。 我的猜测是它将事件添加到文档正文(用于点击/鼠标操作)..我不确定具体细节,但我知道,如果你将它用于一切,你可以通过直播得到一些奇怪的行为。通常最好使用如果您有大量元素,您将应用某些行为,或者如果您将通过javascript动态添加这些元素。

阅读文档了解更多信息: http//api.jquery.com/live/

这是一种平衡的行为。 Live()将事件绑定到文档并搜索触发的事件目标。 生存的优势(即事件委托,通常)是您只为一个无限数量的参数绑定一个事件处理程序。 Bind()将事件处理程序直接附加到元素本身,因此如果表中有1,000行,并且运行$('tr').bind(...) ,则将绑定1,000个事件处理程序。 如果你做了$('tr').live(...)那么你只需绑定一个事件处理程序。

你可以通过使用.delegate()在中间见面,它与live不同,因为你指定了事件的上下文。 因此,它不会总是火,因此更有效。 使用表示例,您将使用$('table').delegate('tr', 'click', function() { .... }); 你可以获得绑定和实时的优点:最小的缺点:你绑定1个事件处理程序,它的未来证明(只有那个表的上下文),你不横向整个dom寻找'tr'元素。

绑定,生活和代理都有自己的位置。

另外,在旁注中,委托只是做$('tr',$('table')[0])。live()的另一种方式,但看起来很难看,因此委托存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM