如何使用JavaScript创建Document对象

jay*_*rjo 34 javascript dom specifications document xmlhttprequest

基本上这就是问题,如何在javascript中动态地从HTML字符串构造一个Document对象?

And*_*y E 29

规范中定义了两种方法,createDocument来自DOM Core Level 2和createHTMLDocumentHTML5.前者创建XML文档(包括XHTML),后者创建HTML文档.两者都作为函数驻留在DOMImplementation接口上.

var impl    = document.implementation,
    xmlDoc  = impl.createDocument(namespaceURI, qualifiedNameStr, documentType),
    htmlDoc = impl.createHTMLDocument(title);
Run Code Online (Sandbox Code Playgroud)

实际上,这些方法相当年轻,仅在最近的浏览器版本中实现.根据http://quirksmode.orgMDN,以下浏览器支持createHTMLDocument:

  • Chrome 4
  • 歌剧10
  • Firefox 4
  • Internet Explorer 9
  • Safari 4

有趣的是,您可以(在某种程度上)在旧版Internet Explorer中创建HTML文档,使用ActiveXObject:

var htmlDoc = new ActiveXObject("htmlfile");
Run Code Online (Sandbox Code Playgroud)

生成的对象将是一个新文档,可以像处理任何其他文档一样进行操作.

  • 我注意到你不包括工作代码.我见过的唯一方法(例如[MDN](https://developer.mozilla.org/en-US/docs/DOM/DOMParser))依赖于`DOMParser.prototype.parseFromString的内置浏览器支持`或者设置新文档的HTML元素的`innerHTML`属性.但是,[根据MSDN](http://msdn.microsoft.com/en-us/library/ie/ms533897%28v=vs.85%29.aspx)(并在测试中显示)HTML元素的innerHTML属性(和其他一些)是**只读**并且不能在IE中设置,包括IE 9. (2认同)

ecm*_*aut 22

假设您正在尝试从标记字符串和内容类型创建完全解析的Document对象,您也碰巧知道(可能是因为您从xmlhttprequest获取了html,因此在其Content-Typehttp标头中获得了内容类型;可能通常text/html) - 它应该很容易:

var doc = (new DOMParser).parseFromString(markup, mime_type);
Run Code Online (Sandbox Code Playgroud)

在一个理想的未来世界中,浏览器DOMParser实现与文档渲染一样强大和有能力 - 也许这是未来HTML6标准工作的良好管道梦想要求.但事实证明,当前的浏览器并没有这样做.

你可能有一个更简单(但仍然很混乱)的问题,就是你需要一个html字符串来获得一个完全解析的Document对象.这是另一个如何做到这一点,它也应该在所有浏览器中工作 - 首先你创建一个HTML Document对象:

var doc = document.implementation.createHTMLDocument('');
Run Code Online (Sandbox Code Playgroud)

然后用你的html片段填充它:

doc.open();
doc.write(html);
doc.close();
Run Code Online (Sandbox Code Playgroud)

现在你应该在doc中有一个完全解析的DOM,你可以运行alert(doc.title)它,使用css选择器切片,doc.querySelectorAll('p')或者使用ditto XPath doc.evaluate.

这实际上适用于现代WebKit浏览器,如Chrome和Safari(我分别在Chrome 22和Safari 6中测试过) - 这是一个示例,它采用当前页面的源代码,在新的文档变量中重新创建它src,读出它的标题,覆盖它使用相同源代码的html引用版本并在iframe中显示结果:http://codepen.io/johan/full/KLIeE

遗憾的是,我认为其他任何当代浏览器都没有相当可靠的实现.


Chr*_*ker 5

根据规范 ( doc ),可以使用createHTMLDocument的方法,可通过以下方式DOMImplementation访问:document.implementation

var doc = document.implementation.createHTMLDocument('My title');  
var body = document.createElementNS('http://www.w3.org/1999/xhtml', 'body'); 
doc.documentElement.appendChild(body);
// and so on
Run Code Online (Sandbox Code Playgroud)