我应该使用.live(...)吗?

cHa*_*Hao 2 jquery events live

当我使用jQuery将事件附加到元素时,我通常这样做:

$(document).ready(function() {
    $('#some_id').click(function() {
        // Do some stuff
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,我已经看到了许多这样的例子:

$('#some_id').live('click', function() {
    // Do some stuff
});
Run Code Online (Sandbox Code Playgroud)

(几乎总是没有ready包装.)

如果元素已经在页面中并且不在任何地方,那么这种方式或其他方式是否存在缺陷?

Dav*_*ang 8

有许多缺点.live(),因此我限制其使用时间:

  1. 需要将大量元素绑定到同一个事件处理程序,或
  2. 经常添加或删除元素.

.live()通过附加事件处理程序document,并检查是否event.target匹配给定的选择器.这导致:

  • 在单击其他 元素时对选择器进行不必要的检查#some_id.
  • 没有机会参加stopPropagation()活动,因为它已经到了根(虽然你仍然可以preventDefault()).
  • 类似地,点击附加到(通过或)父母的处理程序,或者将通过附加的处理程序静音,因为事件将不再到达根目录.#some_id.click().bind()return falsestopPropagation().live()
  • 只能选择器(字符串)一起使用.
  • 可能会导致意外的事件处理顺序,因为事件将按照绑定的顺序触发,而不是以冒泡顺序(子节点到父节点)触发.
  • 如果删除元素,则不会删除该事件.
  • 虽然很少见,但你不能.triggerHandler()对元素.