在此页http://blog.zacharyvoase.com/2010/11/11/sockets-and-nodes-i/上,在javascript控制台中运行以下代码将引发异常。
var div = document.createElement('div'); div.innerHTML = "»";
但它在我尝试的所有其他页面中都能正常工作。我的问题页面有什么特别之处和为什么chrome和firefox会抛出异常?
直接编写角色而不使用实体可以正常工作。
var div = document.createElement('div'); div.innerHTML = "»";
使用其他实体也有效,例如
var div = document.createElement('div'); div.innerHTML = "<";
答案 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之前将命名实体转换为数字实体(例如
- &gt;  
)。
答案 1 :(得分:1)
看起来好像是在试图添加已编码的HTML,但它正在检测它是否格式错误。
是否
var div = document.createElement('div'); div.innerHTML = "&raquo;";
做你需要的事情吗?
每条评论:var dv = document.createElement('div'); dv.innerHTML = "»"; document.getElementById('test').appendChild(dv);
我得到了编码字符here。
你对»
是有效的编码HTML是正确的。我只能猜测它是浏览器的限制。