2009-07-31 28 views
15

有誰知道Google Analytics需要兩個單獨的腳本標記的原因嗎?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-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

爲什麼不能用戶只使用一個腳本塊這樣的:

<!-- 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")); 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

回答

18

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

第一<script>標籤負責創建了谷歌<script>標籤,該標籤將加載外部JS的。第一<script>執行完畢後,DOM看起來如下:

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

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

0

我懷疑這是一個嘗試使用document.write來部署腳本標記以避免模糊的瀏覽器問題。

+5

我懷疑這是晦澀難懂的;我相信當前腳本塊完成後,瀏覽器將只解析腳本標記...可預測的單線程JavaScript執行... – Stobor 2009-07-31 00:11:03

+1

@Stobor:你應該把它寫成答案。我會爲此投票。 :) – chaos 2009-07-31 00:15:11

0

對於它的價值,我們大量使用onclick =「pageTracker._trackPageview(%filename%)」機制來跟蹤直接文件下載,但仍然不希望跟蹤實際的網頁瀏覽直到頁面完成加載。我們必須在頁面頂部包含第一個標籤以啓用該標籤,但最後會留下最終的_trackPageview()調用(好吧,我們也使用var pageTracker位)。

不一定爲什麼他們打破了這種方式,但它使我們的目的更容易一些。

1

第一個塊實際上是使用JavaScript來內聯編寫一個全新的腳本標記來替換該腳本標記。它正在檢查您是否在被請求的頁面上使用「https」,如果是,請使用安全網址請求腳本,否則您的瀏覽器可能會顯示「此頁面的部分內容不安全 - 顯示安全項目嗎?」或者根本拒絕撥打電話。

如果第二個腳本標記包含在第一個腳本標記中,它將被吹走和/或不是一個格式正確的腳本標記,您的代碼將不得不與它們混合。

這樣,您可以乾淨地完成所有對trackPageView的調用並在您自己的塊中設置屬性等,並且仍然可以通過http和https正常工作。

因此,頁面呈現的情況下,DOM看起來像這樣的第一個腳本後執行(普通的HTTP):

<!-- Google Analytics --> 
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script> 

<script type="text/javascript"> 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

這(HTTPS):

<!-- Google Analytics --> 
<script src='https://ssl.google-analytics.com/ga.js' type='text/javascript'></script> 

<script type="text/javascript"> 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 

更多細節: http://code.google.com/apis/analytics/docs/tracking/gaTrackingOverview.html

5

document.write只要在代碼中執行就會發生。因此,如果我們用你的「一個腳本塊」的例子,實際生成的源代碼最終會這樣看:

<!-- 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")); 
try { 
var pageTracker = _gat._getTracker("UA-8720817-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script> 

因此,var pageTracker = _gat._getTracker("UA-8720817-1"); pageTracker._trackPageview();代碼將失敗,因爲_gat不會直到ga.js文件中定義被加載。

這有道理嗎?

相關問題