代码之家  ›  专栏  ›  技术社区  ›  Yahel

总是对唯一的dom元素使用live()而不是bind()的缺点?

  •  3
  • Yahel  · 技术社区  · 14 年前

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

    但是,我越是使用动态生成的内容,我就越觉得它在什么时候模棱两可 bind() 不起作用,最后调试半小时直到我尝试 live() 而且有效。

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

    总是使用有什么缺点吗 而不是 对于这些类型的绑定,除了缺少方便的别名之外,因为只能有一个DOM元素绑定到特定的ID?

    ===========

    编辑:我 绑定() 实时() #uniqueDomElement ),避免考虑何时 绑定() 不合适。

    3 回复  |  直到 11 年前
        1
  •  3
  •   Nick Craver    14 年前

    主要缺点是 .live() 是重量(当使用大量 .live() document 和事件 在那里出现气泡(它工作的整个基础),这意味着当事件到达文档时,必须检查一些事情:

    click 事件。一个 点击 事件泡沫,到目前为止还不错。假设我们有一个或多个 的事件处理程序 注册日期 …现在我们必须循环通过 全部的 你有越多的操作工,这就越贵 每次点击 ,这是迄今为止对 .live() .

    .bind() 打电话来。

        2
  •  0
  •   Matt Wolfe    14 年前

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

    .live使用事件委托,这意味着jquery不会将函数处理程序绑定到页面上的特定元素,而是管理所有不同的live调用,以便在您执行live处理程序所针对的某种操作时,它将检查您对其执行操作的元素是否与给定的选择器匹配(我相信这就是它的工作方式)。我猜它会将事件添加到文档体(用于单击/鼠标操作)。。 我不确定具体细节,但我知道,如果你把live应用到所有事情上,你可能会有一些奇怪的行为。。通常,如果有大量的元素要对其应用某些行为,或者要通过javascript动态添加这些元素,那么最好使用它。

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

        3
  •  0
  •   John Strickler    14 年前

    这是一个平衡的行为。 Live() Bind() 将事件处理程序直接附加到元素本身,因此如果表中有1000行,并且运行 $('tr').bind(...) $('tr').live(...) 那么您只需绑定一个事件处理程序。

    您可以使用.delegate()在中间相遇,这与live不同,因为您指定了事件的上下文。因此,它不会总是开火,因此效率更高。使用表示例,可以使用 $('table').delegate('tr', 'click', function() { .... }); . 您获得了bind和live的优点,但缺点很小:您绑定了1个事件处理程序,它的未来证明(仅限于该表的上下文),您没有遍历整个dom来查找“tr”元素。

    绑定、生活和委派都有自己的位置。

    另外,顺便说一句,delegate只是$('tr',$('table')[0]).live()的另一种方法,但这看起来很难看,因此delegate存在。