DOMContentLoaded、load 事件与 <script>标签的 async、defer 属性

213 阅读1分钟

DOMContentLoaded

  1. DOMContentLoaded 事件发生在 document 对象上。

    document.addEventListener("DOMContentLoaded", callback); 
    
  2. DOM 加载和解析完成之后,立即触发 DOMContentLoaded 事件,因为 CSS 会阻塞页面渲染(不会阻塞 DOM 解析),如果 render tree未解析完成,此时页面不一定渲染出画面。

  3. JS 的执行会阻塞 DOM 解析。

Load

当整个页面所有资源(CSS、JS )加载和解析完成之时,会触发 window 对象上的 load 事件。可以通过 onload 属性获取此事件。标志:浏览器 tag 旋转加载图标消失。

window.addEventListener("load", callback); 

Async and Defer

defer 和 async 都是异步加载脚本。页面读取到script标签时就会异步下载脚本。

Async

  1. 页面读取到脚本的时候开启异步加载线程,下载过程不阻塞DOM解析;
  2. 一旦脚本下载完成,如果DOM解析还为完成(DOMContentLoaded事件未触发),立即阻塞DOM解析,执行脚本;
  3. 多个async脚本不保证执行顺序。

Defer

  1. 页面读取到脚本的时候开启异步加载线程,下载过程不阻塞DOM解析;
  2. DOM解析完成,DOMcontentLoaded事件还未触发时,执行defer脚本,即便脚本提前下载完成;
  3. 多个defer脚本会按照它们在页面出现的顺序下载和执行。

图片说明

image.png