分配innerHTML时是否会发生异常?

MoY*_*mmy 5 javascript dom

我通过https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML阅读,声称SyntaxError可能会发生.

dom = document.createElement('div')
// output: <div></div>
dom.innerHTML = '[try.various.strings.here]'
// output: "[try.various.strings.here]"
dom
// check final DOM
Run Code Online (Sandbox Code Playgroud)

我试图用<div>(部分),<div(破碎)和<div></p>(不匹配)替换测试字符串.从来没有遇到过异常.我想知道我是否需要为它添加预检或保护(try..catch).

T.J*_*der 2

长话短说

\n\n

规范说如果浏览器想要的话就可以,但我认为没有任何主要浏览器对 HTML这样做(好吧,实际上我不会对 IE9-IE11 和某些元素类型做出任何保证)。(而它们对 XML 则如此。 )来自HTML 5.2 规范中 HTML 解析器的定义

\n\n
\n

该规范定义了 HTML 文档的解析规则,无论它们在语法上是否正确。解析算法中的某些点被称为解析错误。解析错误的错误处理是明确定义的(即本规范中描述的处理规则),但用户代理在解析 HTML 文档时可能会在遇到第一个解析错误时中止解析器他们不希望应用本规范中描述的规则。

\n
\n\n

(我的重点)

\n\n

细节

\n\n

DOM解析和序列化规范定义了innerHTML,并表示:

\n\n
\n

设置时,必须运行以下步骤:

\n\n
    \n
  1. fragment为调用片段解析算法的结果,其中新值作为标记,上下文对象作为上下文元素
  2. \n
  3. 如果上下文对象是模板元素,则让上下文对象为模板的模板内容(DocumentFragment)。
  4. \n
  5. 将所有内容替换为上下文对象中的片段。
  6. \n
\n
\n\n

如果我们按照片段解析算法链接,我们会得到:

\n\n
\n

以下步骤形成了片段解析算法,其参数是标记字符串和上下文元素

\n\n
    \n
  1. 如果上下文元素的节点文档是 HTML 文档:令算法为HTML 片段解析算法。\n
    如果上下文元素的节点文档是 XML 文档:令算法为XML 片段解析算法
  2. \n
  3. 新的子元素作为以标记作为输入、以上下文元素作为上下文元素调用算法的结果。
  4. \n
  5. fragment为一个新的DocumentFragment,其节点文档为上下文元素的节点文档。
  6. \n
  7. 将新子节点中的每个节点追加到片段(按树顺序)。
  8. \n
  9. 返回片段的值。
  10. \n
\n
\n\n

如果我们按照上面的HTML 解析算法链接,我们将获得创建和使用 HTML 解析器的步骤。如果我们点击 HTML 解析器定义的链接,我们会得到上面TL;DR中的第一个链接以及上面引用的文本。

\n