浅谈事件冒泡和事件捕获
事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为理解决页面中事件流(事件发生顺序)的问题。
<div id="dv1"> <div id="dv2"> <div id="dv3">click</div> </div></div>比方上图的代码,三个div标签呈嵌套关系,假使三个元素都注册了相同的事件,那么他们的触发顺序是怎么的呢?
故此,为理解决这个事件流问题,微软和网景提出了两种几乎相反的概念。
1.事件冒泡(event bubbling)
微软提出了名为事件冒泡的事件流。事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。可以想象把一颗石头投入水中,泡泡会一直从水底冒出水面。也就是说,事件会从最内层的元素开始发生,一直向上传播,直到document对象。
针对于刚才的例子,三个元素间的触发顺序就应该是 dv3->dv2->dv1.
我们给上面代码里的三个div元素绑定事件,触发一下看看
image
结果如下:
image
这就是事件冒泡。
2.事件捕获(event capturing)
网景提出另一种事件流名为事件捕获。事件从最不准确的对象(document 对象)开始触发,而后到最准确(也可以在窗口级别捕获事件,不过必需由开发人员特别指定),与事件冒泡相反,事件会从最外层开始发生,直到最具体的元素。同样形象的比喻一下可以想象成警察逮捕屋子内的小偷,就要从外面一层层的进入到房子内。
针对刚才的例子,三个元素间的触发顺序应该是dv1->dv2->dv3。
我们给上面代码里的三个div元素绑定事件,触发一下看看:
image
element.addEventListener(event, function, useCapture)addEventListener方法用来为一个特定的元素绑定一个事件解决函数,是JavaScript中的常用方法,其传入三个参数,分别是‘没有on的事件类型’,‘事件解决函数’,‘控制事件阶段’,第三个参数是boolean类型,默认是false,表示在事件冒泡的阶段调用事件解决函数,像上图中传入true,就表示在事件捕获的阶段调用事件解决函数。
结果如下:
image
这就是事件捕获。
3.阻止事件冒泡
①e.stopPropagation()
先前案例的代码如下:
var dv1 = document.getElementById('dv1'); var dv2 = document.getElementById('dv2'); var dv3 = document.getElementById('dv3'); dv1.onclick = function () { console.log(this.id); }; dv2.onclick = function () { console.log(this.id); }; dv3.onclick = function (e) { console.log(this.id); e.stopPropagation(); };结果如下图:
image
②window.event.cancelBubble = true (谷歌,IE8兼容,火狐不支持)
代码如下:
var dv1 = document.getElementById('dv1'); var dv2 = document.getElementById('dv2'); var dv3 = document.getElementById('dv3'); dv1.onclick = function () { console.log(this.id); }; dv2.onclick = function () { console.log(this.id); }; dv3.onclick = function () { console.log(this.id); window.event.cancelBubble = true; };③合并取消:return false
在javascript的return false只会阻止默认行为,而是用jQuery的话则既阻止默认行为又防止对象冒泡。
欢迎纠错,谢谢观看!
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 浅谈事件冒泡和事件捕获