一个如上图的DOM结构 首先是table->tr->td->div->span,分别使用jQuery的api对td div span 分别绑定了click事件。代码如下

$("#join td").click(function(){
alert("这是td");
});
$("#join div").click(function(){
alert("这是div");
});
$("#join .abc").click(function(){
alert("这是span");
});

当点击td的时候弹出”这是TD”、点击div的时候弹出”这是DIV”,”这是TD”、点击span的时候弹出 “这是span”,”这是DIV”,”这是TD” 这种现象被称为事件的传播,也叫事件冒泡 事件冒泡通常在使用中不合理的。那么怎么解决呢?

在W3c中,使用stopPropagation、preventDefault方法可以可以制止事件的默认行为。

$("#nojoin td").click(function(event){
alert("这是td 2");
event.preventDefault();
event.stopPropagation();
});
$("#nojoin div").click(function(event){
alert("这是div 2 ");
event.preventDefault();
event.stopPropagation();
});
$("#nojoin .abc").click(function(event){
alert("这是span 2");
event.preventDefault();
event.stopPropagation();
});

嘿 这次实验成功了。得到了我们期望的效果。

使用jQuery事件回调return false 也可以实现相同的效果。从而少些一些代码,何乐而不为呢。

$("#nojoin td").click(function(event){
alert("这是td 2");
return false;
});
$("#nojoin div").click(function(event){
alert("这是div 2 ");
return false;
});
$("#nojoin .abc").click(function(event){
alert("这是span 2");
return false;
});

其实jQuery的事件回调中可以通过return false来阻止事件传播。翻阅jQuery源码 只要return false 其实它也是执行了 preventDefault,stopPropagation 这2个方法。

附上jQuery源码

if ( ret !== undefined ) {
if ( (event.result = ret) === false ) {
event.preventDefault();
event.stopPropagation();
}
}

本示例演示地址:
https://cqweclick.github.io/eventBubbling.html