迷茫的方式.live与jQuery一起工作

时间:2012-04-30 08:37:21

标签: jquery

我有以下不在文档内部的代码吗?

$('a[href^="content/"]').live('click', function(event)
{
    event.preventDefault();
    ....

此代码位于结束正文标记的正上方。

如果我的HTML主体包含带有匹配href的地址链接,那么当这段代码执行时,即使它们还没有在DOM中,它们也会得到点击甚至附加?我对.live如何运作有点困惑。我通常认为你不会在实际元素上使用.live,而是在将来要填充元素的包含块中使用。

2 个答案:

答案 0 :(得分:3)

  

我通常认为你不会在实际元素上使用.live,而是在将来要填充元素的包含块中使用。

这是代表们所做的。但是,直播活动非常相似 - 他们只是将文档本身用作“包含块”。这样做的缺点是jQuery必须检查页面上出现的给定类型的所有事件。因此,如果可能,您应该始终使用委托(通常可以!)


然而,自从jQuery 1.7以来,各种事件注册方法已统一到.on(),它根据参数注册常规事件和委托。对于直播活动,您只需在document上创建一个委托。

以下是关于注册live / delegate事件的旧/新方法的一些示例(我将省略常规事件,因为它们与.bind()一样,但使用新函数名.on()) :

// live events
$('.foo').live('click', function(e) {}); // old
$(document).on('click', '.foo', function(e) {}); // new

// delegates
$('#container').delegate('.foo', 'click', function(e) {}); // old
$('#container').on('click', '.foo', function(e) {}); // new

答案 1 :(得分:0)

live方法的语法有点混乱,使用起来很棘手。这就是为什么它被更灵活的delegate方法取代,最近也被纳入on方法。

您的代码相当于:

$(document).delegate('a[href^="content/"]', 'click', function(event) { ...

因此,事件真的与文档元素挂钩。

使用live方法无法使用包含块描述的内容。它总是将事件连接到文档元素。您可以使用delegateon方法将事件连接到包含元素。