分享人:吴胜
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
故名思意,事件冒泡就像水底气泡浮到水面这一过程。即是事件从最底层逐个经过上面一级级事件的过程,就是事件冒泡。
默认事件就是浏览器自己的行为,比如我们在点击a标签(a href="#")时候,浏览器跳转到指定页面。比如当我们滚动鼠标时页面会向下滚动。
//js
var a = document.getElementById("123");
var b = document.getElementById("321");
a.addEventListener("click", function () {
alert(1);
})
b.addEventListener("click", function () {
alert(2);
})
//html
<div id="123" style="display:inline-block;width:200px;height:200px;background:
#ff0000;">
我是父级元素
<div id="321"
style="display:inline-block;margin-left:200px;width:100px;height:100px;background:#000;color:#fff;">
我是子级元素
</div>
</div>
看下demo
上面两个父子关系的div,然后分别加了点击事件,当我们在子div里面点击的时候,会发现弹出了一次1,接着又弹出了2,这说明点击的时候,不仅子div的事件被触发了,它的父级的点击事件也触发了,说明子div的将事件传递给了父div。这种就是事件冒泡。
大多数时候,事件冒泡给我们带来的缺是困扰,比如下面这个demo
这个时候我们测试发现,怎么点击#321面板,#123面板都不会显示了,为什么呢?就是冒泡的原因,我们来分析下逻辑,当点击#321的时候,他会触发父亲级别的点击事件,然后一层一层的往上传,所以document的点击事件自然也被触发了,然后执行了自己身上的绑定事件,让#123面板消失。所以当你点击#321的时候首先, 让面板#321显示,只是事件执行太快了,很快又执行了document的点击事件,让面板隐藏。 不信可以再两个事件之间加一个弹出,就可以测试。
取消事件冒泡可以运用下面方法:
e.stopPropagation();
stopPropagation() 方法定义是:不再派发事件。所以直接调用的event 即可
window.event.cancelBubble = true;
这里的cancelBubble是 IE事件对象的属性定义:是否取消冒泡,设为true就可以了。
function stopBubble(e) {
//如果提供了事件对象,则这是一个非IE浏览器
if ( e && e.stopPropagation )
//因此它支持W3C的stopPropagation()方法
e.stopPropagation();
else
//否则,我们需要使用IE的方式来取消事件冒泡
window.event.cancelBubble = true;
}
//js
var b = document.getElementById("321");
b.addEventListener("click", function (e) {// 红色面板加事件
a.style.display = "block";
stopBubble(e);//这样就不会再冒泡给父级了
})
document.onclick = function () {
a.style.display = "none";
}
接下来看demo
function stopDefault(e){
if(e && e.preventDefault){ //判断浏览器是非IE浏览器
e.preventDefault(); //非IE浏览器下使用preventDefault方法
}
else{
//IE浏览器下令事件(window.event)的returnValue属性为false;
window.event.returnValue = false;
}
return false;
}
//js
window.onload = function(){
var test = document.getElementById('test');
test.onclick = function(e){ //当单击此超链接时执行这个函数
alert('URL:' + this.href + ',不会跳转');
stopDefault(e);
}
}
//html
<a> href="http://www.baidu.com" id="test">百度</a>
看Demo
可以利用return false;来阻止 事件冒泡和静默行为。 注意:javascript的return false只会阻止默认行为,而用jQuery的话则既阻止默认行为又防止对象冒泡。
return false不仅阻止了冒泡(默认)行为,也阻止了事件本身。而e.preventDefault()只针对默认行为。
当一个事件发生后,这个事件就要开始传播(从里到外或者从外向里)。为什么要传播呢?因为事件源本身(可能)并没有处理事件的能力, 即处理事件的函数(方法)并未绑定在该事件源上。例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身可能不能处理这个事件,事件必须从这个按钮传播出去, 从而到达能够处理这个事件的代码中(例如我们给按钮的onclick属性赋一个函数的名字, 就是让这个函数去处理该按钮的click事件),或者按钮的父级绑定有事件函数,当该点击事件发生在按钮上,按钮本身并无处理事件函数,则传播到父级去处理。
感谢大家观看
BY : 吴胜