<!DOCTYPEhtml><html><head><metaname="viewport"content="width=device-width,initial-scale=1"><linkhref="style.css"rel="stylesheet"><title>Critical Path: Script</title></head><body><p>Hello <span>web performance</span> students!</p><div><imgsrc="awesome-photo.jpg"></div><script>var span = document.getElementsByTagName('span')[0];
span.textContent ='interactive';// change DOM text content
span.style.display ='inline';// change CSSOM property// create a new element, style it, and append it to the DOMvar loadTime = document.createElement('div');
loadTime.textContent ='You loaded this page on: '+newDate();
loadTime.style.color ='blue';
document.body.appendChild(loadTime);</script></body></html>
JavaScript 允许我们进入 DOM 并拉取对隐藏的 span 节点的引用 - 该节点可能未出现在渲染树中,却仍然存在于 DOM 内。然后,在我们获得引用后,就可以更改其文本(通过 .textContent),甚至可以将其计算的 display 样式属性从“none”替换为“inline”。现在,我们的页面显示“Hello interactive students!”
JavaScript 还允许我们在 DOM 中创建、样式化、追加和移除新元素。从技术上讲,我们的整个页面可以是一个大的 JavaScript 文件,此文件能够逐一创建元素并对其进行样式化。尽管这种方法可行,但是在实践中,使用 HTML 和 CSS 要简单得多。在 JavaScript 函数的第二部分,我们会创建一个新的 div 元素,设置其文本内容,对其进行样式化,然后将其追加到正文中
脚本在文档的何处插入,就在何处执行。当 HTML 解析器遇到一个 script 标记时,它会暂停构建 DOM,将控制权移交给 JavaScript 引擎;等 JavaScript 引擎运行完毕,浏览器会从中断的地方恢复 DOM 构建。
执行我们的内联脚本会阻止 DOM 构建,也就延缓了首次渲染
如果脚本执行的内容是修改尚未建立好的CSSOM,那么浏览器将延迟脚本执行和 DOM 构建,直至其完成 CSSOM 的下载和构建