在本页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 Mac 中的 Firebug: NS_ERROR_DOM_SYNTAX_ERR 指定了无效或非法的字符串
- Safari 5.0.2 Mac:错误:NO_MODIFICATION_ALLOWED_ERR:DOM 异常 7
歌剧:效果很好
但它在我尝试过的所有其他页面上都运行良好。我的问题是该页面有什么特别之处 and 为什么chrome和firefox会抛出异常?
不使用实体直接编写字符效果很好。
var div = document.createElement('div'); div.innerHTML = "»";
使用其他实体也可以,例如
var div = document.createElement('div'); div.innerHTML = "<";
我正在回答我自己的问题。
简短的回答:这是因为浏览器限制。
如果某个页面被某些浏览器识别为 XHTML,则仅支持标准允许的命名字符实体的子集进行 innerHTML 分配。
具体来说,在我的测试中,似乎在 Mozilla 和 Webkit 中,只有"
, &
, <
and >
允许在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 之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)