将HTML实体分配给innerHTML时出现DOM异常

时间:2010-11-12 06:49:56

标签: javascript html innerhtml

在此页http://blog.zacharyvoase.com/2010/11/11/sockets-and-nodes-i/上,在javascript控制台中运行以下代码将引发异常。

var div = document.createElement('div'); div.innerHTML = "»";
  • Chrome 8.0.552.28 Mac:错误:INVALID_STATE_ERR:DOM异常11
  • Firefox 3.6.12中的Firebug Mac:NS_ERROR_DOM_SYNTAX_ERR指定了无效或非法字符串
  • Safari 5.0.2 Mac:错误:NO_MODIFICATION_ALLOWED_ERR:DOM例外7
    Opera:工作正常

但它在我尝试的所有其他页面中都能正常工作。我的问题页面有什么特别之处为什么chrome和firefox会抛出异常

直接编写角色而不使用实体可以正常工作。

var div = document.createElement('div'); div.innerHTML = "»";

使用其他实体也有效,例如

var div = document.createElement('div'); div.innerHTML = "<";

2 个答案:

答案 0 :(得分:16)

我正在回答我自己的问题。

简短回答:这是因为浏览器的限制。

如果某些浏览器将页面识别为XHTML,则只支持标准允许的一组命名字符实体进行innerHTML分配。

特别是在我的测试中,似乎在Mozilla和Webkit中,在innerHTML分配中只允许"&<>

我的测试代码可在此处找到:https://gist.github.com/673901

XHTML是用XML重新制定的“更好”和更清晰的HTML版本。 XHTML 1.1应该是HTML的继承者和未来。但是,采用HTML5不太可能发生这种情况。

与需要专用HTML解析器的HTML不同,XHTML文档可以由通用XML解析器解析。至少在mozilla和webkit中,XHTML和HTML经历了不同的代码路径。可以理解的是,HTML代码路径是大多数工作所需要的地方,并且也经过了更好的测试,因为HTML文档比XHTML要多得多。

值得注意的是,文档是否被识别为XHTML取决于有效的MIME类型而不是文档内容。

结论是,如果您正在使用XHTML,请确保在分配给.innerHTML之前将命名实体转换为数字实体(例如  - >  )。

答案 1 :(得分:1)

看起来好像是在试图添加已编码的HTML,但它正在检测它是否格式错误。
是否 var div = document.createElement('div'); div.innerHTML = "»";做你需要的事情吗?

每条评论:var dv = document.createElement('div'); dv.innerHTML = "»"; document.getElementById('test').appendChild(dv);

我得到了编码字符here

你对»是有效的编码HTML是正确的。我只能猜测它是浏览器的限制。