GWT:setInnerHTML unescapes属性值

时间:2012-07-18 15:34:35

标签: javascript gwt escaping html-entities

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

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

如何在没有实体转换的情况下预先形成内部HTML分配?

澄清:内部HTML分配仅对属性值内的实体进行unescape。

1 个答案:

答案 0 :(得分:2)

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

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

问题在于浏览器,无辜地遵循 HTML文档表示规范中的 Charset实体引用指南并解析您的允许的实体(因此得到解析)。

来自规范:

  

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

解决方案

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

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

关于W3C

的参考资料