我正在查看一个网站,该网站在一个不寻常的地方有一些Google Analytics代码,即在<head>
代码之前。
分析似乎都正常工作......但预期的行为是什么?
在即使是标题之前,JS会立即加载吗?如果是这样,那对于如何跟踪事物有什么影响(如果有的话)?
更广泛地说,在<head>
和<body>
标记之外放置的各种JavaScript的预期行为是什么?
任何建议都非常感激。
干杯。
答案 0 :(得分:1)
只要不引用加载代码中的“head”,javascript仍会加载。
e.g。头部负荷: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>
e.g。脚本代码(谷歌分析使用):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!=='head'。
答案 1 :(得分:1)
现代浏览器的问题在于它们不需要有效的HTML。
现在标签在没有严格检查的情况下被解析。因此,<head>
部分之前但仍在<html>
部分内的任何脚本(或任何标记元素)都被视为文档的<head>
部分的一部分,并且如果仅存在有效标记,则文档中<head>
标记中的任何内容都会保留在<head>
中;如果找到文本或无效标记,则会将其推送到body
。
此类脚本,只要它们不引用<head>
标记就可以了(因为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
元素,并将其与来源进行比较。在上面的同一文档中,如果从<head>
部分中移除了2'作为',
我的意思是:
<!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
那样违反很多规则。试试吧!
希望有所帮助! :)