jQuery持续使用'live'的缺点

时间:2011-09-15 15:03:12

标签: jquery live

在我的应用程序中使用jQuery的'live'是否有任何缺点?

如果我将点击处理程序附加到我想要的所有元素上,然后决定将我的应用程序设置为AJAX,那么我必须在jQuery中添加一些“实时”处理程序。

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

2 个答案:

答案 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)

我可以想到两个缺点:

  1. 文档中列出的警告列表:http://api.jquery.com/live/#caveats
  2. 对于没有经验的开发人员,使用.live会屏蔽正在发生的事件委托,因此可能不清楚这是如何工作的,或者可能妨碍了解事件委派
  3. 一般来说,这是一种非常方便的方法。我鼓励花时间了解事件授权,但也要在有意义的时候使用.live。