【发布时间】:2017-07-28 21:31:32
【问题描述】:
这是一个关于 HTML5 解析器和 DOM API 之间关系的更一般问题的示例。 HTML 中不允许某些显然与 DOM API 无关的内容 - 因此您可以通过 DOM 创建“不允许的”HTML 情况。
例如根据 HTML5 规范,the p element 的内容模型只有“短语内容”。现在"content model" 是“关于必须包含哪些内容作为元素的子元素和后代元素的规范描述”。 "phrasing content" 基本上是文本和“段落内”标记,如链接和跨度,而不是 div 元素。
确实,如果我制作 HTML 文档或导致 HTML sn-p 像这样解析,则 div 会被强制“取消嵌套”:
var containerEl = document.createElement('body');
containerEl.innerHTML = "<p><div></div></p>";
console.log(containerEl.innerHTML); // -> "<p></p><div></div><p></p>"
似乎在解析过程中,“原始”段落被分成两部分,中间是 div。
但是,这段代码让我可以毫无问题地将div 插入p:
let pEl = document.createElement('p'),
divEl = document.createElement('div');
pEl.appendChild(divEl);
console.log(pEl.outerHTML); // -> "<p><div></div></p>"
现在 DOM Level 3 规范说,如果插入了错误的“类型”节点,.appendChild method 可以引发 DOMException:
HIERARCHY_REQUEST_ERR:如果此节点的类型不允许 newChild 节点类型的子节点,则引发
我怀疑在这种情况下“类型”可能更多地指代,例如您不能将 Element 节点附加为 Text 节点的子节点。
标准中是否有任何内容澄清了这里的行为,承认了差异?解析 HTML 时不允许通过 JavaScript 创建 DOM 层次结构会产生什么后果?
【问题讨论】:
-
所有浏览器的行为是否一致?我会采取务实的态度,不会构建不寻常/不正确的元素结构。
-
@AndyG - 是的,它在所有现代浏览器中完全一致,HTML5 standard 和 DOM Standard 要求它们以这种方式工作。
标签: html dom specifications