html
的代码,是从上到下一行行执行的,也就是说若是js
代码写在head
头里,且没有用加在window.onload
方法里,那么他是没法读取到body
里的标签的。之因此加在window.onload
里能够执行,是由于,window.onload
里的函数会在dom
树加载以后执行。link
标签后,会在link
加载(从服务器下载)完毕后,再执行后续代码。但与此同时,若是还有外部文件,则是同时加载(不阻塞后续外部文件link
、script
加载)。可是外部文件内的代码不会执行,只会在代码解析到它的时候执行。script
标签会阻塞html
解析,由于js
可能会改变dom
和css
,所以浏览器会先解析script,避免浪费时间。 要想避免阻塞的话,可以使用defer
和 async
。link
标签不会阻塞其后动态建立的script
的加载与执行,无论script
标签是否具备async
属性。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
<script>
var start = +new Date
</script>
</head>
<body>
test
<script>
var link = document.createElement('link')
link.href = 'http://udacity-crp.herokuapp.com/style.css?rtt=2'
link.rel = 'stylesheet'
document.head.appendChild(link)
var script = document.createElement('script')
script.src = 'http://udacity-crp.herokuapp.com/time.js?rtt=1&a'
document.head.appendChild(script)
</script>
<div id="result"></div>
<script>
var end = +new Date
document.getElementById('result').innerHTML = end - start
</script>
</body>
</html>
复制代码
js
添加async
属性以后,script
加载的外部文件成为了异步加载,这时至关于它于本来的html
解析过程同步进行。因此他不会被任何加载过程阻塞,只会在本身加载完成以后执行。可是,异步执行的影响就是,它如要读取dom
节点,极可能会失败,由于它的加载和html
解析过程没有了前后顺序。另外,若是它要输出动态的dom
节点,就没法保证节点的位置,由于它添加的节点,是在html
已解析的节点下顺序添加的。<script src="http://localhost:8080/test.js" async></script>
复制代码
js
添加
defer
属性以后,
script
加载的外部文件成为了异步加载,执行是同步的。脚本加载不阻塞页面的解析,脚本在获取完后并不当即执行,而是等到
DOM
树加载完毕执行。
defer
后会报错
Uncaught ReferenceError: $ is not defined
。
DOM
树渲染结束前
body
里的
script
已经执行了
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
<script defer src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<div id="d1">我是内容</div>
<script >
console.log($('#d1').html())
</script>
</body>
</html>
复制代码
DOM
元素;display、float、position、overflow
等等;Reflow
的成本比 Repaint
的成本高得多的多。一个节点的 Reflow 颇有可能致使子节点,甚至父节点以及兄弟节点的 Reflow
。className
,若是动态改变样式,则使用cssText
(考虑没有优化的浏览器)DocumentFragment
进行缓存操做,引起一次回流和重绘;display:none
技术,只引起两次回流和重绘;cloneNode(true or false)
和 replaceChild
技术,引起一次回流和重绘;flush
队列的属性,若是你确实要访问,利用缓存;Render Tree
的规模;DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML文档交互的API。DOM 是载入到浏览器中的文档模型,以节点树的形式来表现文档,每一个节点表明文档的构成部分(例如:页面元素、字符串或注释等等)。css
DOM渲染指的是对于浏览器中展示给用户的DOM文档的生成的过程。html
构建DOM树是一个渐进过程,为达到更好用户体验,渲染引擎会尽快将内容显示在屏幕上。它没必要等到整个HTML文档解析完毕以后才开始构建render数和布局。jquery
这三个过程在实际进行的时候不是彻底独立,而是会有交叉。会形成一边加载,一遍解析,一遍渲染的工做现象。浏览器