Day3青训营训练题

106 阅读3分钟

选择题 1:A
关于事件冒泡描述正确的是?
A. 从目标元素向 document 冒泡
B. 从 document 向目标元素冒泡
C. 从 document 向目标元素冒泡,再从目标元素向 document 冒泡
D. 以上都不是

选择题 2:AD
以下哪些 script 标签属性会使脚本有可能在 DOMContentLoaded 事件之后加载?
A. script async

B. 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 image.png

阻止事件冒泡可以使用: (1)event.stopPropagation()

b2.onclick = function(e){
    console.log("box2")
    e.stopPropagation()
}

image.png (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 image.png

DOMContentLoaded

原文「安歌的博客」:DOMContentLoaded blog.csdn.net/qq_32682137…

原文「编译青春」:你不知道的 DOMContentLoaded zhuanlan.zhihu.com/p/25876048

MDN解析:当初始HTML文档已完全加载和解析时,将触发DOMContentLoaded事件,而不需要等待样式表,图像和子框架页面加载(事件可以用来检测HTML页面是否完全加载完毕(fully-loaded))。

  1. 普通js

文档解析的过程中,如果遇到script脚本,就会停止页面的解析进行下载,当脚本都执行完毕后,才会继续解析页面。 image.png

  1. async

async脚本会在加载完毕后执行。 async脚本的加载不计入DOMContentLoaded事件统计,有可能发生的两种情况:

  • HTML 还没有被解析完的时候,async脚本已经加载完了,那么 HTML 停止解析,去执行脚本,脚本执行完毕后触发DOMContentLoaded事件。

image.png

  • HTML 解析完了之后,async脚本才加载完,然后再执行脚本,那么在HTML解析完毕、async脚本还没加载完的时候就触发DOMContentLoaded事件

image.png

  1. defer

文档解析时,遇到设置了defer的脚本,就会在后台进行下载,但是并不会阻止文档的渲染,当页面解析和渲染完毕后,会等到所有的defer脚本加载完毕并按照顺序执行完毕才会触发DOMContentLoaded事件,有可能发生的两种情况:

  • HTML 还没有被解析完的时候,defer脚本已经加载完了,那么 等待HTML 解析完成后执行脚本,脚本执行完毕后触发DOMContentLoaded事件。

image.png

  • HTML 解析完了之后,defer脚本才加载完,然后再执行脚本,脚本执行完毕后触发DOMContentLoaded事件。

image.png