选择题 1:A
关于事件冒泡描述正确的是?
A. 从目标元素向 document 冒泡
B. 从 document 向目标元素冒泡
C. 从 document 向目标元素冒泡,再从目标元素向 document 冒泡
D. 以上都不是选择题 2:AD
以下哪些 script 标签属性会使脚本有可能在 DOMContentLoaded 事件之后加载?
A. script asyncB. script defer
C. script type="module"
D. script type="module" async
事件冒泡
事件冒泡和事件捕获 www.jianshu.com/p/8311f782f…
事件冒泡:事件从事件源沿着嵌套关系从内向外传递
focus,blur,change,submit,reset,select等事件不冒泡,事件代理是用的冒泡原理
一般的,事件分为三个阶段:捕获阶段、目标阶段和冒泡阶段。
<div id="box1">
<div id="box2">
<div id="box3">点击</div>
</div>
</div>
var b1=document.getElementById("box1")
var b2=document.getElementById("box2")
var b3=document.getElementById("box3")
b1.onclick = function(){console.log("box1")}
b2.onclick = function(){console.log("box2")}
b3.onclick = function(){console.log("box3")}
点击box3,会依次在控制台打印box3、box2、box1
阻止事件冒泡可以使用: (1)event.stopPropagation()
b2.onclick = function(e){
console.log("box2")
e.stopPropagation()
}
(2)判断event.target 和 event.currentTarget是否相等
b2.onclick=function(){
if(event.target==event.currentTarget){
console.log("box2")
}
}
(3)window.event.cancelBubble = true (谷歌,IE8兼容,火狐不支持) (4)return false (jQuery) 不仅阻止事件冒泡,还可以阻止事件默认行为
事件捕获
在捕获的过程中,最外层(根)元素的事件先被触发,然后依次向内执行,直到触发最里面的元素(事件源)
注意:IE低版本没有捕获,普通事件绑定方法没有捕获 addEventListener绑定事件,如果把第三个参数设置为true,则在捕获的时候执行事件
b1.addEventListener('click',function(e){console.log("box1")},true)
b2.addEventListener('click',function(e){console.log("box2")},true)
b3.addEventListener('click',function(e){console.log("box3")},true)
点击box3,会依次在控制台打印box1、box2、box3
DOMContentLoaded
原文「安歌的博客」:DOMContentLoaded blog.csdn.net/qq_32682137…
原文「编译青春」:你不知道的 DOMContentLoaded zhuanlan.zhihu.com/p/25876048
MDN解析:当初始HTML文档已完全加载和解析时,将触发DOMContentLoaded事件,而不需要等待样式表,图像和子框架页面加载(事件可以用来检测HTML页面是否完全加载完毕(fully-loaded))。
- 普通js
文档解析的过程中,如果遇到script脚本,就会停止页面的解析进行下载,当脚本都执行完毕后,才会继续解析页面。
- async
async脚本会在加载完毕后执行。 async脚本的加载不计入DOMContentLoaded事件统计,有可能发生的两种情况:
- HTML 还没有被解析完的时候,async脚本已经加载完了,那么 HTML 停止解析,去执行脚本,脚本执行完毕后触发DOMContentLoaded事件。
- HTML 解析完了之后,async脚本才加载完,然后再执行脚本,那么在HTML解析完毕、async脚本还没加载完的时候就触发DOMContentLoaded事件
- defer
文档解析时,遇到设置了defer的脚本,就会在后台进行下载,但是并不会阻止文档的渲染,当页面解析和渲染完毕后,会等到所有的defer脚本加载完毕并按照顺序执行完毕才会触发DOMContentLoaded事件,有可能发生的两种情况:
- HTML 还没有被解析完的时候,defer脚本已经加载完了,那么 等待HTML 解析完成后执行脚本,脚本执行完毕后触发DOMContentLoaded事件。
- HTML 解析完了之后,defer脚本才加载完,然后再执行脚本,脚本执行完毕后触发DOMContentLoaded事件。