在我的应用程序中使用jQuery的'live'是否有任何缺点?
如果我将点击处理程序附加到我想要的所有元素上,然后决定将我的应用程序设置为AJAX,那么我必须在jQuery中添加一些“实时”处理程序。
我在谈论性能和HTTP请求等......有什么缺点?
答案 0 :(得分:8)
你永远不应该使用live
。当jQuery引入它时,这是一个错误。仅使用delegate
。
使用live
时,jQuery必须在文档上单击每次点击。在大多数情况下,这是过度的。想象一下:
<table id="products">
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</table>
现在,您希望在所有这些行上绑定click事件处理程序。如果你采用live
方式,你会这样做:
$('tr').live('click', function(){...});
这里发生的事情是,只要点击整个页面上的任何元素,jQuery就必须通过你的选择器运行它(在这种情况下{{1} })看它是否匹配。这是没有充分理由浪费大量资源的原因。你可以通过以下方式完成同样的事情:
tr
这将导致jQuery仅侦听该表中的单击事件(尽管它仍会运行该选择器检查点击的每种类型的元素)。
现在,有时你确实需要听取整个页面的点击次数。但是,即使你确实需要,你仍然可以更好地使用$('#products').delegate('tr', 'click', function(){...});
。
想象一下以下场景:
$(document).delegate('a', 'click', function(){...});
你在这里做的是遍历所有$('a').live('click', function(){...});
标签的DOM,但你没有对该集合做任何事情。你只是在做你可以完成的事情:
a
但不首先遍历DOM!
进一步阅读:
http://api.jquery.com/live/#caveats
http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/
更新:随着jQuery 1.7的出现,the new .on
method was introduced:
$(document).delegate('a', 'click', function(){...});
方法将事件处理程序附加到jQuery对象中当前选定的元素集。从jQuery 1.7开始,.on()
方法提供了附加事件处理程序所需的所有功能。
因此,在上面的示例中,您将使用它:
.on()
和这个
$('#products').on('click', 'tr', function(){...});
分别
虽然旧方法仍然有效,但现在这是首选方法。
答案 1 :(得分:1)
我可以想到两个缺点:
一般来说,这是一种非常方便的方法。我鼓励花时间了解事件授权,但也要在有意义的时候使用.live。