我正在查看一个网站,其中有一些Google Analytics(分析)代码位于不常见的位置,即<head>
标记之前。会发生什么事情谷歌分析代码出现在头之前?
Analytics(分析)似乎都能正常工作......但是对此的预期行为是什么?
即使在标题之前,JS是否会立即加载?如果是这样,那么对于如何跟踪事物会有什么影响(如果有的话)?
更广泛地说,在<head>
和<body>
标签之外放置的各种JavaScript的预期行为是什么?
任何意见非常感谢。
干杯。
我正在查看一个网站,其中有一些Google Analytics(分析)代码位于不常见的位置,即<head>
标记之前。会发生什么事情谷歌分析代码出现在头之前?
Analytics(分析)似乎都能正常工作......但是对此的预期行为是什么?
即使在标题之前,JS是否会立即加载?如果是这样,那么对于如何跟踪事物会有什么影响(如果有的话)?
更广泛地说,在<head>
和<body>
标签之外放置的各种JavaScript的预期行为是什么?
任何意见非常感谢。
干杯。
现代浏览器的麻烦在于它们不需要有效的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')
和查看他们的head
和body
元素,并将其与源数据进行比较。以上述相同的文档,如果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>
,你会看到head
和body
都使用相同的开发者现在不同了安慰。看,我告诉过你意想不到的的行为。
时下标签是基于上下文来识别的,浏览器不会出现像<html><title>TitleHere
这样的违反了很多规则的问题。自己试试!
希望有帮助! :)
只要不引用加载代码中的“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 == '头'!。
这是不正确的 - “”,“
”和“”标签丢失时被推断。请参阅http://stackoverflow.com/q/5641997/501771 – Timothy003@ Timothy003,是的,他们被推断,但是当你自己写'
'标签,以及不在''标签内的标签时,不同的浏览器会对它进行不同的解释并产生意外的行为,因此无法准确预测跨浏览器会发生什么情况。这就是我在这里提到的。你是否在我说“无效HTML”的地方提到我的陈述? – artfuldev它实际上是相当可预测的 - [来自规范:](https://www.w3.org/TR/html5/syntax.html#parsing-main-inhead)“当用户代理将规则应用于”在头部“插入模式下,用户代理必须如下处理令牌:[...] tag标签名称为'head'的开始标签;↪任何其他结束标签:解析错误,忽略令牌。你的回答表明'
'标签仍然被解析,但你不能在脚本中引用它;这不是真的。解析器会为您插入一个''标签,并且会忽略您编写的标签 – Timothy003