2014-02-18 77 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 == '头'!。