我有以下不在文档内部的代码吗?
$('a[href^="content/"]').live('click', function(event)
{
event.preventDefault();
....
此代码位于结束正文标记的正上方。
如果我的HTML主体包含带有匹配href的地址链接,那么当这段代码执行时,即使它们还没有在DOM中,它们也会得到点击甚至附加?我对.live如何运作有点困惑。我通常认为你不会在实际元素上使用.live,而是在将来要填充元素的包含块中使用。
答案 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
方法无法使用包含块描述的内容。它总是将事件连接到文档元素。您可以使用delegate
或on
方法将事件连接到包含元素。