0

此字符串:<a onclick="doit('&#39;')">...</a>从服务器端接收,需要设置为元素的内部 HTML。

当我使用Element#setInnerHTML字符串被转换为 时<a onclick="doit(''')">...</a>,即将 HTML 实体转义为它所代表的字符。

如何在没有实体转换的情况下执行内部 HTML 分配?

澄清:内部 HTML 分配仅取消转义属性值内的实体。

4

1 回答 1

2

setInnerHTML()实现本身没有问题,因为它的唯一作用是为底层 JS 对象分配一个属性值,通过检查 的源代码可以看出Element

public final native void setInnerHTML(String html) /*-{
    this.innerHTML = html || '';
}-*/;

问题出在浏览器中,无辜地遵循HTML 文档表示规范中的字符集实体引用指南并解析您的实体,这些实体在属性节点内是允许的(因此被解析)。

从规范:

作者还应该在属性值中使用“ &amp;”,因为在 CDATA 属性值中允许字符引用。

解决方案

在服务器端(或通过过滤器或指定的客户端代理),使用相应的 HTML 实体转义属性值内的所有特殊字符,例如:

<a onclick=\"doit('&amp;#39;')\">...</a>

W3C 参考资料

于 2012-07-18T19:54:40.313 回答