提问者:小点点

规范要求设置节点的innertext/textContent自动转义HTML实体吗?


我正在尝试显示一个代码片段,它可以是类似HTML/XML的语言。 为了转义HTML实体,我碰巧发现以下代码在工作:

<!-- html code -->
<pre><code id="foo"></code></pre>
// js code
document.querySelector('#foo').textContent = '<p>a paragraph</p>';

innertext也能工作,但innerhtml不能,这是预期的。

我已经在最新的Chrome和Firefox上测试过了,但我不确定textContentinnertext的自动转义在其他主流浏览器中是否有很好的支持。 相关的DOM和HTML API规范在这方面似乎有点模糊。

那么这种行为是规范所要求的吗,因此是转义字符串的一种安全方法吗?


共1个答案

匿名用户

理解以下之间的区别很重要:

  • 将HTML源文件提供给浏览器中的HTML解析器,以便根据您的意愿构造(和呈现)DOM,以及
  • 在构建DOM后使用JavaScript操作现有DOM

当您设置现有DOM节点的TextContent时,您使用的是浏览器提供的API,该API将接受您提供的任何文本,并创建一个类型为text的新DOM节点,并将给定的字符串作为其内容。 当您这样做时,HTML根本就不相关了:不会咨询HTML解析器。 因此,HTML实体表示法是不必要的,事实上,如果您尝试使用它,您将得到包含文字HTML实体表示法的文本节点。

当然,在HTML源代码中,您必须使用HTML实体表示法来编码特殊字符,但这是因为您是通过HTML解析器提供内容的。 一旦解析器完成,存在于DOM中的文本节点就不会显示那些HTML实体的踪迹:解析器解释它们,创建字符串,并根据您在HTML源代码中表达的愿望创建纯文本节点。

相关问题