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

Arr*_*rix 7 html javascript innerhtml

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

var div = document.createElement('div'); div.innerHTML = "»";
Run Code Online (Sandbox Code Playgroud)
  • Chrome 8.0.552.28 Mac:错误:INVALID_STATE_ERR:DOM例外11
  • Firefox 3.6.12 Mac中的Firebug: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 = "»";
Run Code Online (Sandbox Code Playgroud)

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

var div = document.createElement('div'); div.innerHTML = "<";
Run Code Online (Sandbox Code Playgroud)

Arr*_*rix 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代码路径是大多数努力的地方,也是更好的测试,因为有比XHTML更多的HTML文档.

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

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

  • +1,做得好,自己搞清楚. (3认同)