事情是這樣的:
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上,當(dāng)我單擊div1的時(shí)候觸發(fā)事件,但是我不想讓div2上邊的事件也觸發(fā),所以我要阻止事件冒泡。那么問題來了,不生效,div2上邊的事件還是觸發(fā)了。經(jīng)過各種阻止事件冒泡的方法(return false; ),結(jié)果還是一樣無效。
通過網(wǎng)絡(luò)查詢沒有找到自己滿意的答案。有一個(gè)網(wǎng)友說了一下方式:
$('.div1').on('click', function(event) {
alert('a on c');
event.stopPropagation();
});
$('.div2').on('click', function(event) {
alert('a on b');
});
當(dāng)這不是我想要的結(jié)果。在某些情況下,我必須把事件綁定到一個(gè)父級(jí)元素的形式。尤其是觸發(fā)事件的元素是后來動(dòng)態(tài)加載進(jìn)來的。
后來特地用jQuery 也做了測(cè)試。jQuery 完全可以實(shí)現(xiàn)沒有任何的問題.
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 源碼還算看的懂,是要實(shí)現(xiàn)這個(gè)阻止冒泡,但是Zepto 這個(gè)就完全搞不懂了,所以在源碼上找到問題的根源是破滅了。