先決條件:腳本前面存在外部樣式
以下試驗雖然是在chrome下,但是對於IE8+以及其他瀏覽器也適用。
1、內聯腳本(http://jsbin.com/mudab/1)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JS Bin</title> <script>var start = +new Date;</script> <link href="http://udacity-crp.herokuapp.com/style.css?rtt=2" rel="stylesheet"> <script>
var end = +new Date;
console.log(end-start);
</script> </head> <body> <span></span> </body> </html>
控制台打印結果>2000,可以得出結論:外部樣式會阻塞后面內聯腳本的執行。
2、阻塞型外部腳本(http://jsbin.com/qeliri/1)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JS Bin</title> <script>var start = +new Date;</script> <link href="http://udacity-crp.herokuapp.com/style.css?rtt=2" rel="stylesheet"> </head> <body> test <script src="http://udacity-crp.herokuapp.com/time.js?rtt=1&a"></script> <div id="result"></div> <script>var end = +new Date;document.getElementById("result").innerHTML = end-start;</script> </body> </html>
瀑布流中可以看出腳本和css並行加載,但是從js執行結果(js執行結果和打印時間基本同時出現,時間上可以相當於js執行時間)大於2000,可以得出結論:外部樣式不會阻止后面外部腳本的加載,但是外部腳本的執行必須等到css加載完畢。也就是說外部樣式不會阻塞外部腳本的加載,但會阻塞外部腳本的執行。
3、異步執行型外部腳本(http://jsbin.com/velat/1)
注:IE6-9不支持async(IE支持defer)。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JS Bin</title> <script>var start = +new Date;</script> <link href="http://udacity-crp.herokuapp.com/style.css?rtt=2" rel="stylesheet"> </head> <body> test <script src="http://udacity-crp.herokuapp.com/time.js?rtt=1&a" async></script> <div id="result"></div> <script>var end = +new Date;document.getElementById("result").innerHTML = end-start;</script> </body> </html>
腳本執行結果>1000&&<2000,從瀑布流中可以看出腳本是和css並行加載的,說明此時並沒有出現阻塞。對於具有async屬性的腳本,外部css不會阻塞。
4、異步加載型外部腳本(http://jsbin.com/zuvuce/1)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JS Bin</title> <script>var start = +new Date;</script> <link href="http://udacity-crp.herokuapp.com/style.css?rtt=2" rel="stylesheet"> </head> <body> test <script> var script = document.createElement('script'); script.src = "http://udacity-crp.herokuapp.com/time.js?rtt=1&a"; document.getElementsByTagName('head')[0].appendChild(script); </script> <div id="result"></div> <script>var end = +new Date;document.getElementById("result").innerHTML = end-start;</script> </body> </html>
腳本執行結果大於3000,從瀑布流中可以看出,受內聯腳本被阻塞(1)的影響,js開始加載時間在css加載完之后。結論如第一條。
建議:
1、腳本應該放在外部css的前面,不論腳本是內聯還是外部(當然,最好是腳本放在body的最后面);
2、可以的話,外部css最好直接內聯到頁面。
PS:css並不會阻塞圖片等資源的下載,但會影響body內容的呈現(http://jsbin.com/jokopa/1)。
參考文章:
Script-injected "async scripts" considered harmful