我有一个以xhtml格式提供的网站(标题为doctype)。我从服务器获取数据,有时包含一些
实体,当我尝试通过innerHTML
设置包含此字符串的字符串时会导致错误。我怎么知道我可以在服务器端替换所有这些项目,但我想知道的是:
我是否可以将此实体添加到doctype声明中,而不是在服务器上替换它?
修改
换句话说,为什么会这样:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
[
<!ENTITY nbsp " ">
]>
只是不行?
答案 0 :(得分:1)
更新2:
从http://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml1(设置的第2部分),XHTML的算法似乎没有提及它是否知道DOCTYPE信息,尽管它至少知道命名空间。 (注意我切换到更简单但符合标准的XHTML5 DOCTYPE。)
我认为您可能提供以下测试用例并报告为错误,或者可能将其提交到WhatWG邮件列表中,因为我认为该行为至少应该是规范的(除非它是,并且我我只是没有看到它):
<!DOCTYPE html [
<!ENTITY nbsp " ">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<div id="a">old text</div>
<script><![CDATA[
document.getElementById('a').innerHTML = 'new text';
]]></script>
</html>
与此同时,如果您不想在服务器上进行替换,可以使用DOMParser()
下面的黑客攻击:
<!DOCTYPE html [
<!ENTITY nbsp " ">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<div id="a">old text</div>
<script><![CDATA[
document.getElementById('a').innerHTML = new DOMParser().parseFromString(
'<!DOCTYPE html [<!ENTITY nbsp " ">]>'+
'<html xmlns="http://www.w3.org/1999/xhtml">'+
'new text'+
'</html>',
'application/xhtml+xml'
).documentElement.innerHTML;
]]></script>
</html>