在我的应用程序中使用jQuery的"实时"是否有任何缺点?
如果我将点击处理程序附加到我想要的所有元素,然后决定使我的应用程序AJAX,我必须通过并在我的jQuery中添加一些"实时"处理程序.
我在谈论性能和HTTP请求等......有什么缺点?
你永远不应该使用live.当jQuery引入它时,这是一个错误.只能使用delegate.
使用时live,jQuery必须收听文档上的每次单击.在大多数情况下,这是过度的.想象一下:
<table id="products">
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
现在,您希望在所有这些行上绑定click事件处理程序.如果你走的live路,你会这样做:
$('tr').live('click', function(){...});
Run Code Online (Sandbox Code Playgroud)
这里发生的事情是,无论何时单击整个页面上的任何元素,jQuery都必须通过选择器(在本例中)运行它以查看它是否匹配.这是没有充分理由浪费大量资源的原因.你可以通过以下方式完成同样的事情tr
$('#products').delegate('tr', 'click', function(){...});
Run Code Online (Sandbox Code Playgroud)
这将导致jQuery只监听该表中的单击事件(尽管它仍会运行该选择器检查所单击的每种类型的元素).
现在,有时你确实需要听取整个页面的点击.但是,即使你确实需要,你仍然可以更好地使用$(document).delegate('a', 'click', function(){...});.
想象一下以下场景:
$('a').live('click', function(){...});
Run Code Online (Sandbox Code Playgroud)
你在这里做的是遍历所有a标签的DOM ,但你没有对该集合做任何事情.你只是在做你可以完成的事情:
$(document).delegate('a', 'click', function(){...});
Run Code Online (Sandbox Code Playgroud)
但不首先遍历DOM!
进一步阅读:
http://api.jquery.com/live/#caveats
http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/
该
.on()方法将事件处理程序附加到jQuery对象中当前选定的元素集.从jQuery 1.7开始,该.on()方法提供了附加事件处理程序所需的所有功能.
因此,在上面的示例中,您将使用此:
$('#products').on('click', 'tr', function(){...});
Run Code Online (Sandbox Code Playgroud)
还有这个
$(document).on('click', 'a', function(){...});
Run Code Online (Sandbox Code Playgroud)
分别.
虽然旧方法仍然有用,但现在这是首选方法.