Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是一个<;头>;元素在DOM中始终可用,即使在HTML标记中不存在?_Javascript_Html_Dom_Document_Domdocument - Fatal编程技术网

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');