设置 document.body.outerHTML 会创建空头。为啥?

Posted

技术标签:

【中文标题】设置 document.body.outerHTML 会创建空头。为啥?【英文标题】:Setting document.body.outerHTML creates empty heads. Why?设置 document.body.outerHTML 会创建空头。为什么? 【发布时间】:2019-03-24 02:36:18 【问题描述】:

重置document.bodyouterhtml 属性有一个奇怪的副作用:它将额外的空<head></head> 添加到DOM 中,就在body 之前:

head  display: inline; counter-increment: h; border: 1px solid; 
head:last-of-type::after  content: 'Head elements count: ' counter(h); 
[onclick]::after  content: attr(onclick); 
<button onclick="document.body.outerHTML=document.body.outerHTML"></button>

所有浏览器似乎在这方面都是一致的。我已经been told 它被指定为这种方式,但无法挖掘权威标准的立场,甚至在讨论档案中也没有提及。你知道这方面的一些背景,还是有一些技术原因必须这样?有什么想法吗?

【问题讨论】:

因为 body 的内容是可替换的,但 body 本身不是?无论如何,它看起来像一个错误。 @ChaseChoi 但错误报告被关闭为无效引用它的行为符合规范。而且它似乎在浏览器中是通用的。 【参考方案1】:

有趣的问题。不幸的是,解释隐藏在HTML fragment parsing algorithm 的细节中,该细节引用自DOM Parsing 规范中outerHTML 的定义。

您需要非常仔细地跟踪解析器状态以了解原因,但本质上它是这样工作的。使用outerHTML,解析器被初始化,就好像它刚刚解析了给定节点的父节点的开始标记。对于 document.body,这就是 html 元素。

在 HTML 解析算法中,当解析一个 html 开始标记时,解析器接下来需要的是一个 head 元素。但是因为在 HTML 中,head 元素的开始和结束标签是可选的,如果接下来没有看到 head 开始标签,它会推断出一个。所以在 document.body.outerHTML 的情况下,解析器接下来看到的是 body 开始标签,因此首先创建了一个空的 head 元素。

最后,一旦片段被解析,整个片段,包括推断的 head 元素都被添加到 DOM 中。

【讨论】:

以上是关于设置 document.body.outerHTML 会创建空头。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

短视频运营短视频剪辑 ⑤ ( 视频素材使用 | 设置插入后的视频素材属性 | 设置画面 | 设置音频 | 设置变速 | 设置动画 | 设置调节 )

SeeMusicMIDI 编辑功能 ( 速度设置 | SoundFont 音源设置 | 混响强度设置 | 混响时间设置 | 力度增益设置 | 实时 MIDI 设置 )

win10设置里的代理怎么设置

强制恢复出厂设置?

怎么设置标题样式?

HTMLHTML 注册表单案例 ① ( 表格设置 | 设置表格位置和大小 | 设置表格标题 | 表单设置 | 表格中设置单选按钮 )