事情是这样的:
html
<div class="div2">
<div class="div1"></div>
</div>
js
$('body').on('click', '.div1', function(event) {
alert('a on c');
event.stopPropagation();
});
$('body').on('click', '.div2', function(event) {
alert('a on b');
});
这种情况事件都绑定到了body上,当我单击div1的时候触发事件,但是我不想让div2上边的事件也触发,所以我要阻止事件冒泡。那么问题来了,不生效,div2上边的事件还是触发了。经过各种阻止事件冒泡的方法(return false; ),结果还是一样无效。
通过网络查询没有找到自己满意的答案。有一个网友说了一下方式:
$('.div1').on('click', function(event) {
alert('a on c');
event.stopPropagation();
});
$('.div2').on('click', function(event) {
alert('a on b');
});
当这不是我想要的结果。在某些情况下,我必须把事件绑定到一个父级元素的形式。尤其是触发事件的元素是后来动态加载进来的。
后来特地用jQuery 也做了测试。jQuery 完全可以实现没有任何的问题.
jQuery源码
stopPropagation: function() {
var e = this.originalEvent;
this.isPropagationStopped = returnTrue;
if ( e && e.stopPropagation ) {
e.stopPropagation();
}
}
Zepto源码
e = compatible(e);
if (e.isImmediatePropagationStopped()) return;
e.data = data;
var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args));
if (result === false) e.preventDefault(), e.stopPropagation();
return result
jQuery 源码还算看的懂,是要实现这个阻止冒泡,但是Zepto 这个就完全搞不懂了,所以在源码上找到问题的根源是破灭了。