我正在尝试显示一个代码片段,它可以是类似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上测试过了,但我不确定textContent
和innertext
的自动转义在其他主流浏览器中是否有很好的支持。 相关的DOM和HTML API规范在这方面似乎有点模糊。
那么这种行为是规范所要求的吗,因此是转义字符串的一种安全方法吗?
理解以下之间的区别很重要:
当您设置现有DOM节点的TextContent
时,您使用的是浏览器提供的API,该API将接受您提供的任何文本,并创建一个类型为text
的新DOM节点,并将给定的字符串作为其内容。 当您这样做时,HTML根本就不相关了:不会咨询HTML解析器。 因此,HTML实体表示法是不必要的,事实上,如果您尝试使用它,您将得到包含文字HTML实体表示法的文本节点。
当然,在HTML源代码中,您必须使用HTML实体表示法来编码特殊字符,但这是因为您是通过HTML解析器提供内容的。 一旦解析器完成,存在于DOM中的文本节点就不会显示那些HTML实体的踪迹:解析器解释它们,创建字符串,并根据您在HTML源代码中表达的愿望创建纯文本节点。