根据
文档,
stopPropagation()
在
live()
中无法按预期工作,因为
live()
仅在事件冒泡到
document
后才执行该事件。
但是,如果您使用的是jQuery 1.4.3或更高版本,则
stopPropagation()
开始起作用。
自1.4.3以来,
live()
已经重写了多次。
live()
文档列出了许多原因,说明为什么使用其他绑定方法比较好。不过,文档中的信息似乎是针对1.4.1行为的,并且与实际当前行为不完全同步。
例如,查看添加了
on()
的1.7.1源代码,显示
live()
正在使用
on()
:
live: function( types, data, fn ) {
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
}
演示 - 使用您的代码并在jQuery 1.4.1中运行-stopPropagation不起作用,如预期所需。
演示 - 使用您的代码并在jQuery 1.4.3中运行-stopPropagation现在可以工作。
摘要
live()
在1.4.3中进行了重新编写。我认为这是由于添加了delegate()
。
随着每个jQuery版本的改进,live()
一直在不断更新。
一般来说,为了避免使用live()
时出现任何意外的结果,请遵循文档中的指南,并使用给定版本的建议方法:
$(selector).live(events, data, handler); // jQuery 1.3+
$(document).delegate(selector, events, data, handler); // jQuery 1.4.3+
$(document).on(events, selector, data, handler); // jQuery 1.7+
为了完整性,我在下面添加了1.4.1和1.4.3版本的
live()
源代码提取。
1.4.1源码
live: {
add: function(proxy, data, namespaces, live) {
jQuery.extend(proxy, data || {});
proxy.guid += data.selector + data.live;
data.liveProxy = proxy;
jQuery.event.add(this, data.live, liveHandler, data);
},
remove: function(namespaces) {
if (namespaces.length) {
var remove = 0,
name = new RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
jQuery.each((jQuery.data(this, "events").live || {}), function() {
if (name.test(this.type)) {
remove++;
}
});
if (remove < 1) {
jQuery.event.remove(this, namespaces[0], liveHandler);
}
}
},
special: {}
}
1.4.3 source
live: {
add: function(handleObj) {
jQuery.event.add(this, liveConvert(handleObj.origType, handleObj.selector), jQuery.extend({}, handleObj, {
handler: liveHandler,
guid: handleObj.handler.guid
}));
},
remove: function(handleObj) {
jQuery.event.remove(this, liveConvert(handleObj.origType, handleObj.selector), handleObj);
}
}
$('a').on( "click", function() {alert("link"); return false;} );
? - Morpheuslive
。如果将它们更改为bind
,它们都会被调用。 - Andy