今天在寫項目的的時候遇到一個問題,將jquery文件的引入放在js代碼之前項目不報錯,但是放在js代碼之后,在瀏覽器運行html會報出$ is not defined,但是在其他的html頁面中,放在js代碼之后卻不會產生這樣的問題,思來想去,考慮這可能與html頁面的加載順序有關,html頁面的加載順序是:
從上到下運行,先解析head標簽中的代碼,
1>head標簽中會包含一些引用外部文件的代碼,從開始運行就會下載這些被引用的外部文件
當遇到script標簽的時候,瀏覽器暫停解析(不是暫停下載),將控制權交給JavaScript引擎(解釋器)
如果<script>標簽引用了外部腳本,就下載該腳本,否則就直接執行,執行完畢后將控制權交給瀏覽器渲染引擎
2>當head中代碼解析完畢,會開始解析body中的代碼,如果此時head中引用的外部文件沒有下載完,將會繼續下載
瀏覽器解析body代碼中的元素,會按照head中聲明一部分樣式去解析,如果此時遇到body標簽中的<script>,
同樣會將控制權交給JavaScript引擎來解析JavaScript 解析完畢后將控制權交還給瀏覽器渲染引擎。
當body中的代碼全部執行完畢、並且整個頁面的css樣式加載完畢后,css會重新渲染整個頁面的html元素。
3>按照之前的描述,<script>寫到body標簽內靠后比較好,
因為JavaScript 會操作html元素, 如果在body加載完之前寫JavaScript 會造成JavaScript 找不到頁面元素
但是我們經常將<script>寫到head中,body中不會有大量的js代碼,body中的html代碼結構會比較清晰
window.onload: 等待頁面中的所有內容加載完畢之后才會執行
$(document).ready(): 頁面中所有DOM結構繪制完畢之后就能夠執行
可以這樣理解:window.onload 和 $(document).ready()/$(function(){}); 相當於 寫在body 內 最靠后的<script> 代碼段
所以瀏覽器應該是解析完body之后,先去引入js,在解析js代碼,以后要是遇到$ is not defined這樣的錯誤,可以將引入js放到js代碼的前面