我把这些代码放到Firefox上:
<div id="my">
<div title="<b> title </b>"><b> text </b></div>
</div>
评估后:
document.getElementById("my").innerHTML
我得到了:
"<div title="<b> title </b>"><b> text </b></div>"
如您所见,标题属性已损坏......这是一个错误吗?
指向游乐场的链接:http://jsfiddle.net/uGXQP/
更新我在Firefox和Opera下运行测试 - 它重现了。在Chrome上它按预期工作。
更新2 我发现此问题适用于http://code.google.com/p/canvg/项目。它有一个主程序,它需要SVG作为字符串作为输入参数。这样做的自然方法是使用 innerHTML ...
所以这个库将DOM解析为字符串,并且无法正确处理属性值中的&lt;&gt; 字符流...
答案 0 :(得分:3)
innerHTML
属性通常不会在HTML源文档中为您提供标记。相反,它执行DOM中元素内容的序列化。目前还没有标准,但HTML5 CR指定serializing HTML fragments的规则,DOM Parsing and Serialization WD根据此类序列定义innerHTML
。这意味着标记的许多部分将被规范化,并且这包括在属性值内,字符“&lt;”如此出现的原则。如果它在HTML中被写为<
,则在解析期间它已被转换为“&lt;” - DOM没有关于用于表示“&lt;”的原始语法的信息。不幸的是,有些浏览器错了。
无论如何,如果您希望属性值包含四个字符<
,则需要编写它们以便对&符号进行转义:&lt;
。
答案 1 :(得分:2)
不,这不是一个错误。表达属性值的两种方式是等价的(因为&
在属性值中具有特殊含义,但<
没有。它没有被破坏,只是表达方式不同。
如果要在属性值中存储&
字符,请执行&
。
如果您想获取属性值,请使用element.getAttribute
。