如何让Firefox将XML命名空间附加到我的html元素?

时间:2015-08-03 21:36:00

标签: javascript dom cross-browser xhtml

我在客户端创建XHTML文档如下:

var xhtmlDocType = document.implementation.createDocumentType(
  'html',
  '-//W3C//DTD XHTML 1.0 Transitional//EN',
  'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
);
myDocument = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', xhtmlDocType);

在Chrome中运行此代码时,输​​出(myDocument.documentElement.outerHTML)正如我所料,生成的html元素如下所示:<html xmlns="http://www.w3.org/1999/xhtml">,但在Firefox中运行相同的代码时,html element没有xmlns属性:<html>。 Firefox文档似乎也被视为HTML,不会关闭<meta>标记。

这是一个提供示例的JSFiddle,可以在Chrome或Firefox中查看其中的差异:http://jsfiddle.net/70avhuo3/5/

在我的特定用例中,我需要xmlns属性和Firefox将文档视为XHTML,以使文档有效并正确显示。如何通过修改我创建文档的方式或者如何提取内容来获得一致性?

2 个答案:

答案 0 :(得分:2)

Firefox 将文档视为XMLDocument,而不是HTML文档。你可以这样说,因为如果你得到一个元素tagName,如果它是一个HTML文档,那么tagName将是大写的,即使你用小写指定createElement()也是如此。这不会发生在XMLDocument中。

请参阅http://jsfiddle.net/70avhuo3/6/,而不是http://jsfiddle.net/70avhuo3/7/

由于outerHTML的实施,您没有看到xmlns属性。对于XML文档,根据DOM serialization and parsing draft spec,这应该将DOM序列化为XML,但似乎Firefox不会这样做。

您可以使用new XMLSerializer().serializeToString(myDocument.documentElement);来获取Firefox中的XML序列化。见http://jsfiddle.net/70avhuo3/8/

顺便说一句,我强烈建议您始终将createElementNS()与XMLDocuments一起使用,而不是createElement()。在DOM3中,createElement()将元素放在null命名空间中,而DOM4规范当前表示它将进入http://www.w3.org/1999/xhtml命名空间,尽管这一变化仍然是一个积极争论的问题。

答案 1 :(得分:1)

您可以直接设置属性吗?它出现在Firefox中按预期工作。

myDocument.documentElement.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml')