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
這三個過程在實際進行的時候不是徹底獨立,而是會有交叉。會形成一邊加載,一遍解析,一遍渲染的工做現象。瀏覽器