3

我把这样的代码放到 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 解析为字符串并且不能正确处理<>字符它在属性值中流...

4

2 回答 2

3

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

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

于 2013-08-05T15:20:05.673 回答
2

不,这不是错误。表示属性值的两种方式是等价的(因为&在属性值内部有特殊含义,但<没有)。它没有被损坏,只是表达方式不同。

如果要将&字符存储在属性值中,请按&amp;.

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

于 2013-08-05T13:19:23.713 回答