GWT:setInnerHTML取消映射属性值

GWT: setInnerHTML unescapes attribute values

本文关键字:属性 映射 取消 setInnerHTML GWT      更新时间:2023-12-03

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

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

如何在没有实体转换的情况下预生成内部HTML赋值?

澄清:内部HTML赋值只取消映射属性值内的实体

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

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

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

根据规范:

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

解决方案

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

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

W3C参考文献

  • HTML文档表示法·Charset
  • 字符实体引用