2

我有一个以 xhtml 形式提供的网站(带有标题和文档类型)。我从服务器获取数据,这些数据有时包含一些 实体,当我尝试设置包含此内容的字符串时会导致错误 via innerHTML。我如何发现我可以在服务器端替换所有这些项目,但我想知道的是:

我也可以将此实体添加到 doctype 声明中,而不是在服务器上替换它吗?

编辑:

换句话说,为什么会这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
[
    <!ENTITY nbsp  "&#160;">
]>

只是不工作?

4

1 回答 1

1

更新 2:

http://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml1(关于设置的第二部分),XHTML 的算法似乎没有提到它是否知道 DOCTYPE 信息,尽管它至少知道命名空间。(注意我切换到更简单但符合标准的 XHTML5 DOCTYPE。)

我认为您可能会提供以下测试用例并将其报告为错误,或者将其提交到 WhatWG 邮件列表中,因为我认为该行为至少应该是规范的(除非它是,我只是没有看到它):

<!DOCTYPE html [
    <!ENTITY nbsp "&#160;">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<div id="a">old&nbsp;text</div>
<script><![CDATA[
document.getElementById('a').innerHTML = 'new&nbsp;text';
]]></script>
</html>

同时,如果你不想在服务器上替换,你可以使用下面这样的黑客DOMParser()

<!DOCTYPE html [
    <!ENTITY nbsp "&#160;">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<div id="a">old&nbsp;text</div>
<script><![CDATA[

document.getElementById('a').innerHTML = new DOMParser().parseFromString(
    '<!DOCTYPE html [<!ENTITY nbsp "&#160;">]>'+
    '<html xmlns="http://www.w3.org/1999/xhtml">'+
      'new&nbsp;text'+
    '</html>',
    'application/xhtml+xml'
  ).documentElement.innerHTML;

]]></script>
</html>
于 2012-09-29T23:08:41.887 回答