2010-06-06 49 views
10

編輯:由於Andrew Moore指出這個問題是Two separate script tags for Google Analytics?的重複所以這個問題應該刪除,以避免混亂堆棧溢出,除非有一點保持這一點,因爲它可能會出現在稍有不同的搜索。在網頁上使用多個腳本塊有什麼不同?

在網頁上使用多個腳本塊有什麼不同?我已經粘貼了包含Google Analytics的標準代碼作爲示例,並且我看到了在其他地方使用的相同模式。爲什麼這段代碼分成兩個單獨的腳本塊,而不是僅僅使用一個?

<script type="text/javascript"> 
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); 
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); 
</script> 
<script type="text/javascript"> 
    try{ 
     var pageTracker = _gat._getTracker("UA-xxxxxx-x"); 
     pageTracker._trackPageview(); 
    } catch(err) {} 
</script> 
+0

我知道GA代碼只是一個例子,但我認爲這個標籤是值得的,例如,對於尋找相同事物的人來說。 – 2010-06-06 21:26:27

+0

重複。我知道我在... – Guffa 2010-06-06 21:26:27

+1

之前回答了同樣的問題[Google Analytics(分析)的兩個單獨腳本標記可能重複](http://stackoverflow.com/questions/1210034/two-separate-script-tags-for-谷歌分析) – 2010-06-06 21:29:30

回答

5

第二個<script>包含的代碼依賴於google-analytics.com/ga.js加載。

未延遲的腳本按它們在DOM中的存在順序執行。

第一<script>注入後自己的新<script>(與src指向谷歌的ga.js),它立即加載並執行 - 最後才第二<script>得到執行。

+0

+1我現在讀了它兩遍後,我的壞。 – Ben 2010-06-06 21:39:17

2

在您的例子中,第一腳本塊使用document.write寫另一個腳本元件,其加載外部腳本,然後所述第二腳本元件使用在外部腳本中定義的東西。我很確定把它分成兩個腳本塊是必要的。

如果你不使用這種奇怪的技巧,將多個腳本塊放在一行通常不會有什麼特別的。讓他們在頁面的不同部分是有用的,當你希望腳本在文檔加載時運行。如果你的頁面很長,你可能需要一些腳本在它正在加載時運行,以便儘快初始化。應儘早使用小部件來替換元素,以避免頁面在最終加載完成時跳來跳去。

1

如果第一個程序段中的代碼以異常結束,那麼第二個程序段也會起作用。

+0

真的!可能不是Google爲什麼這樣做(一個'try'塊可以解決這個問題),但這是一個完全合理的點... – 2010-06-06 21:24:49

+1

-1:不是原因,爲什麼這是分成兩個塊。而你所描述的是不好的做法(它彈出IE上的腳本錯誤對話框)。 – 2010-06-06 21:33:57

+0

安德魯:廢話的垃圾原因。原始問題包含兩個部分:「在網頁上使用多個腳本塊有什麼不同?」以及有關Google代碼的問題。這個答案可能不涉及第二部分,但肯定涉及第一部分,而且我不認爲這是廣爲人知的,並且沒有被其他答案提及,所以我認爲這是有幫助和相關的。 – 2010-06-06 22:32:51

5

<script>標籤按順序執行。如果前一個執行沒有完成,則一個<script>塊無法執行。

第一個<script>標籤負責創建將加載外部js的Google <script>標籤。第一<script>執行完畢後,DOM看起來如下:

<script></script> <!-- First Script Tag --> 
<script></script> <!-- Google Injected Script --> 
<script></script> <!-- Second Script Tag --> 

這保證了第二<script>標籤將不會執行,直到.js加載完成。如果將第一個和第二個<script>合併,這會導致_gat變量未定義(因爲在第一個腳本執行完畢之前,Google注入腳本不會開始加載)。

相關問題