是否始终在DOM中提供<head>元素,即使HTML标记中不存在?

Bun*_*gle 14 html javascript dom document domdocument

我观察到的每个浏览器都会创建一个<head>可在DOM中访问的元素,即使<head></head>文档的标记中没有显式标记也是如此.

但是,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);
})();
Run Code Online (Sandbox Code Playgroud)

以下行:

(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
Run Code Online (Sandbox Code Playgroud)

对于<head>没有元素的情况,似乎做出了特别的让步.

这只是一个极端向后兼容的情况(例如,对于Netscape 4等),或者有没有假设现代浏览器(即Internet Explorer 6和更新版本)始终可以访问的情况到<head>DOM中的元素?

Lar*_*y K 14

现代浏览器在需要时为您创建头元素.

但是,如果您希望您的代码是防弹的,那么假设客户端会这样做并不聪明.所以Google员工保守且安全.

他们陈述中的附加条款是微不足道的,但增加了额外的可靠性.所以这是件好事.

ps在问题上做得很好并拔出相关代码.

添加:

HTML规范说,头标记是可选的.我不认为浏览器在dom中创建头部"元素"是规范所要求的.谷歌不希望(也不应该)指望它在那里.

  • HTML 4.01规范说head*元素*是必需的.只有*标签*是可选的.见http://www.w3.org/TR/1999/REC-html401-19991224/struct/global.html#edef-HTML.当然,浏览器通常不遵循规范,如果它们始终自动创建头元素,那将是因为大量现实世界的网页在没有这样做的浏览器中中断. (2认同)