jQuery持续使用'live'的缺点

ben*_*e89 1 jquery live

在我的应用程序中使用jQuery的"实时"是否有任何缺点?

如果我将点击处理程序附加到我想要的所有元素,然后决定使我的应用程序AJAX,我必须通过并在我的jQuery中添加一些"实时"处理程序.

我在谈论性能和HTTP请求等......有什么缺点?

Jos*_*ber 8

你永远不应该使用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/


更新:随着jQuery 1.7的出现,引入了新.on方法:

.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)

分别.

虽然旧方法仍然有用,但现在这是首选方法.

  • -1,这并没有真正解释为什么或提供任何参考 (2认同)