我在頁面加載後動態添加一些<script>
標籤到head元素。我知道這些腳本是異步加載的,但是我能期望它們按照它們添加的順序被解析嗎?應該訂購動態腳本嗎?
我在Firefox中看到預期的行爲,但在Safari或Chrome中看不到。看着Chrome開發者工具和Firebug的文檔時,都表現出以下 -
<html>
<head>
...
<script type="text/javascript" src="A.js"></script>
<script type="text/javascript" src="B.js"></script>
</head>
...
</html>
但是看資源裝載視圖,鉻似乎解析無論是從服務器首先返回,而螢火蟲總是加載它們爲了添加腳本標籤,即使B首先從服務器返回。
我應該期望Chrome/Safari以指定的順序解析文件嗎?在OS X上使用Chrome 5.0.375.29測試版10.6.3
EDIT(10年10月5日):當我說的解析,我的意思是執行 - 可以看到積極的分析有很多好處 - THX rikh
EDIT( 11/5/10):好的,我按照下面的juandopazo的說法進行了一項測試。但是我添加了一些東西的組合,包括
- 直接用javascript將腳本元素添加到頭部。 (測試A - > D)
- 使用jquery的append()方法將腳本元素添加到頭部。 (測試E→H)
- 用jquery的getScript()方法'加載'腳本。 (測試I - > L)
我還嘗試了腳本標記上'異步'和'延遲'屬性的所有組合。
您可以在此訪問測試 - http://dyn-script-load.appspot.com/,並查看源代碼以瞭解其工作原理。加載的腳本只需調用update()函數。
首先要注意的是,只有上述第一種和第三種方法並行操作 - 第二種方法順序執行請求。你可以看到這個位置圖 -
圖片1 - 請求生命週期的圖表
Request lifecycle Graph http://dyn-script-load.appspot.com/images/dynScriptGraph.png
這也是有趣的是,jQuery的追加()方法也阻止getScript加入()調用 - 你可以看到,沒有任何的它們執行直到所有的append()調用完成,然後它們全部並行運行。最後需要注意的是,jQuery append()方法顯然會在腳本執行完成後從文檔頭中移除腳本標記。只有第一種方法會在文檔中留下腳本標記。
鉻結果
結果是Chrome瀏覽器始終執行的第一個腳本返回,不管測試。這意味着除了jQuery append()方法外,所有測試都失敗了。
圖片2 - Chrome 5.0.375。29測試結果
Chrome Results http://dyn-script-load.appspot.com/images/chromeDynScript.png
火狐結果
Firefox上,然而,它看起來是,如果使用第一種方法,和異步爲假(即,未設置),則腳本將可靠地執行在訂購。
圖片3 - FF 3.6.3結果
FF Results http://dyn-script-load.appspot.com/images/ffDynScript.png
注意的Safari似乎給不同的結果以相同的方式如鉻,這是有意義的。
另外,我只對緩慢的腳本500ms的延遲,只是爲了保持開始 - >完成時間了。您可能需要刷新幾次才能看到Chrome和Safari在所有方面都會失敗。
在我看來,如果不這樣做的方法,我們不採取的檢索並行數據的能力優勢,沒有理由我們不應該(火狐所示)。
我已經提出了這個bug在Chrome的問題寄存器 - http://code.google.com/p/chromium/issues/detail? id = 46109 – hawkett 2010-06-08 22:45:51