Javascript 是一个<;头>;元素在DOM中始终可用,即使在HTML标记中不存在?
我观察到的每个浏览器都会创建一个Javascript 是一个<;头>;元素在DOM中始终可用,即使在HTML标记中不存在?,javascript,html,dom,document,domdocument,Javascript,Html,Dom,Document,Domdocument,我观察到的每个浏览器都会创建一个元素,即使文档的标记中没有明确的标记,也可以在DOM中访问该元素 但是,Google Analytics使用以下代码进行动态脚本插入: (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'htt
元素,即使文档的标记中没有明确的
标记,也可以在DOM中访问该元素
但是,Google Analytics使用以下代码进行动态脚本插入:
(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';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
})();
以下一行:
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
似乎对不存在
元素的情况做出了特殊让步
这仅仅是一个极端向后兼容性的例子(例如,对于Netscape 4或类似产品),还是不假设现代浏览器(例如,Internet Explorer 6和更新版本)总是能够访问DOM中的
元素?现代浏览器会在需要时为您创建head元素
但是,如果您希望代码是防弹的,那么假设客户机将这样做是不明智的。所以谷歌人是保守和安全的
他们声明中的额外条款是最小的,但增加了额外的可靠性。所以这是件好事
ps在问题上做得很好,并提取出相关代码
添加:
说明head标记是可选的。我不认为浏览器在dom中创建头“元素”是规范所要求的。Google不想(也不应该)指望它在那里。事实上,并不是所有浏览器在加载文档时都会自动创建
。我的意思是,即使在Chrome(版本:9.0.597.102)这样的现代浏览器上也不行
将图像直接加载到浏览器时,例如:http://www.stylesight.com/assets/external/home_carousel/en/materials_ss12_m.jpg
,浏览器将只生成包含图像的
标记,并且在源代码中找不到
标记
谷歌使用此代码:
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
我们无法使用文档创建
。createElement('head')
:使用该文档将产生错误:“错误:层次结构\u请求\u错误:DOM异常3”
因此,当没有head标记时,您不能向其附加任何内容。这就是为什么谷歌将元素放在
中的原因。它没有被赋予“head”元素,它通常会出现,这取决于浏览器和文档DOCTYPE。有关此问题的讨论和多项测试,请参阅:
以下内容将解决许多怪癖,它是加载通用脚本(包括GA等)的最短可重用代码:
在这里,脚本也会从文档中删除(加载/执行后),但这只是个人喜好,如果需要,可以跳过“removeChild”。将其移除或保留在原位,行为上没有任何区别。IE6甚至IE5.5添加
HEAD
元素(如果不存在),其他浏览器如Safari谢谢,CMS!IE 6是我很久以来支持的最早版本,所以我已经习惯了自动添加
的浏览器,这是有道理的。HTML4.01规范说head元素是必需的。只有标签是可选的。看见当然,浏览器通常不遵循规范,如果它们始终自动创建head元素,那将是因为大量真实世界的网页在不这样做的浏览器中出现。回答得好!非常感谢你的帮助@Alohci:谢谢你的额外输入-这很有意义。我很困惑…head元素是必需的,但是标记是可选的…没有标记你怎么定义head元素?@user1036719--你可以通过编程在dom中创建元素,即使html本身中没有html标记。Larry:嗯,“必需”是什么那是什么意思?什么时候需要?还要注意的是,同样的逻辑应该适用于例如标题
(作为标题
)但同样的标准在那里说:“开始标签:必需,结束标签:必需”。对于@user1036719的问题,肯定还有别的答案。也许用户代理只是被要求暗示HEAD
元素应该在哪里,而不管它的标签是什么。顺便说一句,+1您是否可以为不能动态创建head
标记的语句添加一个引用?@GitaarLAB:the“Error:HIERARCHY\u REQUEST\u ERR:DOM Exception 3”
是一个引用,假设它是从浏览器控制台复制的。如果能指出是哪个浏览器生成的,那就太好了。@slebetman:事实上,我的意思是:哪些浏览器会抛出这个,哪些(权威的)在线资源会“记录”这个。
function require(src) {
var s, d = document, r = d.documentElement;
(s = d.createElement('script')).src = src;
r.removeChild(r.insertBefore(s, r.firstChild));
}
require(('https:' == document.location.protocol ?
'https://ssl' : 'http://www') +
'.google-analytics.com/ga.js');