我在客户端创建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,以使文档有效并正确显示。如何通过修改我创建文档的方式或者如何提取内容来获得一致性?
答案 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')