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

How can I get Firefox to attach an XML namespace to my html element?

我正在创建 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 元素没有 xmlns 属性:<html>。 Firefox 文档似乎也被视为 HTML,不关闭 <meta> 标签。

这里有一个 JSFiddle 作为示例,可以在 Chrome 或 Firefox 中查看以查看区别:http://jsfiddle.net/70avhuo3/5/

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

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

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

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

http://jsfiddle.net/70avhuo3/6/ as opposed to 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() 与 XML 文档一起使用,而不要 createElement()。在 DOM3 中,createElement() 会将元素放入 null 命名空间,而 DOM4 规范目前表示它将进入 http://www.w3.org/1999/xhtml 命名空间,尽管更改仍然是积极辩论的问题。