用于属性值中字符引用的innerHTML不会保留为转义序列。有办法解决吗?

时间:2013-08-05 13:14:56

标签: javascript html escaping

我把这些代码放到Firefox上:

<div id="my">
    <div title="&lt;b&gt; title &lt;/b&gt;">&lt;b&gt; text &lt;/b&gt;</div>
</div>

评估后:

document.getElementById("my").innerHTML

我得到了:

"<div title="<b> title </b>">&lt;b&gt; text &lt;/b&gt;</div>"

如您所见,标题属性已损坏......这是一个错误吗?

指向游乐场的链接:http://jsfiddle.net/uGXQP/

更新我在Firefox和Opera下运行测试 - 它重现了。在Chrome上它按预期工作。

更新2 我发现此问题适用于http://code.google.com/p/canvg/项目。它有一个主程序,它需要SVG作为字符串作为输入参数。这样做的自然方法是使用 innerHTML ...

所以这个库将DOM解析为字符串,并且无法正确处理属性值中的&lt;&gt; 字符流...

2 个答案:

答案 0 :(得分:3)

innerHTML属性通常不会在HTML源文档中为您提供标记。相反,它执行DOM中元素内容的序列化。目前还没有标准,但HTML5 CR指定serializing HTML fragments的规则,DOM Parsing and Serialization WD根据此类序列定义innerHTML。这意味着标记的许多部分将被规范化,并且这包括在属性值内,字符“&lt;”如此出现的原则。如果它在HTML中被写为&lt;,则在解析期间它已被转换为“&lt;” - DOM没有关于用于表示“&lt;”的原始语法的信息。不幸的是,有些浏览器错了。

无论如何,如果您希望属性值包含四个字符&lt;,则需要编写它们以便对&符号进行转义:&amp;lt;

答案 1 :(得分:2)

不,这不是一个错误。表达属性值的两种方式是等价的(因为&在属性值中具有特殊含义,但<没有。它没有被破坏,只是表达方式不同。

如果要在属性值中存储&字符,请执行&amp;

如果您想获取属性值,请使用element.getAttribute