2014-02-18 70 views
1

我正在查看一個網站,其中有一些Google Analytics(分析)代碼位於不常見的位置,即<head>標記之前。會發生什麼事情谷歌分析代碼出現在頭之前?

Analytics(分析)似乎都能正常工作......但是對此的預期行爲是什麼?

即使在標題之前,JS是否會立即加載?如果是這樣,那麼對於如何跟蹤事物會有什麼影響(如果有的話)?

更廣泛地說,在<head><body>標籤之外放置的各種JavaScript的預期行爲是什麼?

任何意見非常感謝。

乾杯。

回答

1

現代瀏覽器的麻煩在於它們不需要有效的HTML。

現在標籤被解析,因爲它們在沒有嚴格檢查的情況下遇到。因此,在<head>部分之前但仍在<html>部分之內的任何腳本(或任何標籤元素)被視爲文檔的<head>部分的一部分,並且文檔中的<head>標籤中存在的任何內容都被保留在<head>中,如果僅存在有效標籤,並且如果找到文本或無效標籤,則將其推送到body

這樣的腳本,只要他們沒有引用<head>標籤就沒問題(因爲頭標籤已經改變了)。這是正常的行爲,但意想不到的行爲,並且可以在瀏覽器甚至它們的版本之間改變。隨着瀏覽器的發展,他們開始接受偏離嚴格標準的文件和結構。您可以使用Chrome的開發者控制檯(F12)本文件驗證這一點:

<!DOCTYPE html> 
<html> 
<script> 
console.log(document.getElementsByTagName('title')); 
</script> 
<head> 
    <title>This</title> 
    as 
    <script>var s="sastra";console.log(s); 
    </script><title>This2</title> 
    as 
</head> 
    <body> 
     <a href="http://google.com">Click here for Google</a> 
     <p> How are you?</p> 
    </body> 
</html> 

,並呼籲document.getElementsByTagName('html')和查看他們的headbody元素,並將其與源數據進行比較。以上述相同的文檔,如果2「」從<head>段內取出,

我的意思是這樣的:

<!DOCTYPE html> 
<html> 
<script> 
console.log(document.getElementsByTagName('title')); 
</script> 
<head> 
    <title>This</title> 
    <script>var s="sastra";console.log(s); 
    </script><title>This2</title> 
</head> 
    <body> 
     <a href="http://google.com">Click here for Google</a> 
     <p> How are you?</p> 
    </body> 
</html> 

,你會看到headbody都使用相同的開發者現在不同了安慰。看,我告訴過你意想不到的的行爲。

時下標籤是基於上下文來識別的,瀏覽器不會出現像<html><title>TitleHere這樣的違反了很多規則的問題。自己試試!

希望有幫助! :)

+0

這是不正確的 - 「」,「」和「」標籤丟失時被推斷。請參閱http://stackoverflow.com/q/5641997/501771 – Timothy003

+0

@ Timothy003,是的,他們被推斷,但是當你自己寫''標籤,以及不在''標籤內的標籤時,不同的瀏覽器會對它進行不同的解釋併產生意外的行爲,因此無法準確預測跨瀏覽器會發生什麼情況。這就是我在這裏提到的。你是否在我說「無效HTML」的地方提到我的陳述? – artfuldev

+0

它實際上是相當可預測的 - [來自規範:](https://www.w3.org/TR/html5/syntax.html#parsing-main-inhead)「當用戶代理將規則應用於」在頭部「插入模式下,用戶代理必須如下處理令牌:[...] tag標籤名稱爲'head'的開始標籤;↪任何其他結束標籤:解析錯誤,忽略令牌。你的回答表明''標籤仍然被解析,但你不能在腳本中引用它;這不是真的。解析器會爲您插入一個''標籤,並且會忽略您編寫的標籤 – Timothy003

1

只要不引用加載代碼中的「head」,JavaScript仍將加載。

例如頭部負載:https://stackoverflow.com/a/6683376/94668

<script> 
var script = document.createElement("script"); 
    script.src = "yourfile.js"; 
    script.async = true; //asynchronous 
    document.getElementsByTagName("head")[0].appendChild(script); 
</script> 

例如,腳本代碼(谷歌分析使用):https://developers.google.com/analytics/devguides/collection/gajs/#quickstart

(function() { 
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 
})(); 

基本上查找getElementsByTagName(elementString)並確保elementString == '頭'!。