一、为什么会有这一篇的文章
国庆前几天由于任务比较重,要赶在国庆前把一个进度的任务开发完成,所以也就有点赶,但是却遇到了一个比较奇怪的Bug,导致了任务比预计的延迟了几个小时,对此深表遗憾,所以利用国庆的这段时间来补一补这个不足,也为了国庆后能够更好的完成公司的业务打下基础
二、大致了解什么是JavaScript事件流
首先这里先来举一个例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div style="width:200px;height:200px;background:lightblue" id="content"> <div style="width:100px;height:100px;background: lightyellow;" id="btn1"> </div> </div> </body> <script type="text/javascript"> var content=document.getElementById("content"); var btn1=document.getElementById('btn1'); btn1.onclick=function(){ alert("btn1"); }; content.onclick=function(){ alert("content"); } </script> </html>
先不看运行结果:这个时候你可以大胆的猜一猜,这个时候是先弹出btn1,还是先弹出content,这个就涉及到JavaScript事件流的问题(这个我就剧透一下运行的结果是先弹出btn1,后弹出content
从这个问题就引出了一个JS事件流的问题,也就是关于事件触发顺序的问题
三、JS事件流分析
JS事件流最早要从IE和网景公司的浏览器大战说起,IE提出的是冒泡流,而网景提出的是捕获流,后来在W3C组织的统一之下,JS支持了冒泡流和捕获流,但是目前低版本的IE浏览器还是只能支持冒泡流(IE6,IE7,IE8均只支持冒泡流),所以为了能够兼容更多的浏览器,建议大家使用冒泡流。
JS事件流原理图如下:
从图中我们可以知道
1、一个完整的JS事件流是从window开始,最后回到window的一个过程
2、事件流被分为三个阶段(1~5)捕获过程、(5~6)目标过程、(6~10)冒泡过程
3、在冒泡过程中6比7早触发,也就解释了上面那题,为什么btn1,会比content先触发
然而在有些情况下JS的事件流不会根据上图这个从捕获过程到目标过程到冒泡过程这样去推进的,
DOM Level捕获事件冒泡事件DOM Level 0 不支持 支持
DOM Level 2 支持 支持
DOM Level 3 支持 支持
从表中我们可以知道在DOM Level 0事件的时候是不支持捕获事件的,那么什么是Level 0呢
四、what is DOM Level
这一章,我们就来探讨什么是DOM Level,先从DOM Level 0说起,以上面的例子为例,JS部分可以这样改写为:
var btn1=document.getElementById("btn1"); var content=document.getElementById("content"); btn1.onclick=function(){ alert("btn1_click"); } btn1.onclick=function(){ alert("btn1_click2"); } content.onclick=function(){ alert("content_click"); }
运行的结果是先弹出btn1_click2,然后弹出content_click,从这里案例我们可以得出这几点: