我可以在Internet Explorer中将整个HTML文档加载到文档片段中吗?

这是我遇到的一些困难。我有一个本地客户端脚本,该脚本需要允许用户获取远程网页并在结果页面中搜索表单。为了做到这一点(不使用正则表达式),我需要将文档解析为一个完全可遍历的DOM对象。


我想强调一些限制:


我不想使用库(如jQuery)。我在这里要做的事情太肿了。

在任何情况下都不应执行远程页面中的脚本(出于安全原因)。

诸如的DOM API getElementsByTagName必须可用。

它仅需要在Internet Explorer中工作,但至少需要7个版本。

假装我无权访问服务器。我可以,但是我不能用它。

我尝试过的

假设我在变量中有完整的HTML文档字符串(包括DOCTYPE声明)html,这是到目前为止我已经尝试过的操作:


var frag = document.createDocumentFragment(),

div  = frag.appendChild(document.createElement("div"));


div.outerHTML = html;

//-> results in an empty fragment


div.insertAdjacentHTML("afterEnd", html);

//-> HTML is not added to the fragment


div.innerHTML = html;

//-> Error (expected, but I tried it anyway)


var doc = new ActiveXObject("htmlfile");

doc.write(html);

doc.close();

//-> JavaScript executes

我也尝试过从HTML 提取<head>and <body>节点,并将它们添加到<HTML>片段中的元素中,仍然没有运气。


有人有什么想法吗?


慕桂英3389331
浏览 423回答 3
3回答

紫衣仙女

不确定为什么要弄乱documentFragments,您可以将HTML文本设置为innerHTML新div元素的。然后,您可以将该div元素用于getElementsByTagNameetc,而无需将div添加到DOM:var htmlText= '<html><head><title>Test</title></head><body><div id="test_ele1">this is test_ele1 content</div><div id="test_ele2">this is test_ele content2</div></body></html>';var d = document.createElement('div');d.innerHTML = htmlText;console.log(d.getElementsByTagName('div'));如果您真的对documentFragment的想法感兴趣,则可以使用此代码,但仍必须将其包装在div中才能获得所需的DOM函数:function makeDocumentFragment(htmlText) {&nbsp; &nbsp; var range = document.createRange();&nbsp; &nbsp; var frag = range.createContextualFragment(htmlText);&nbsp; &nbsp; var d = document.createElement('div');&nbsp; &nbsp; d.appendChild(frag);&nbsp; &nbsp; return d;}

长风秋雁

我不确定IE是否支持document.implementation.createHTMLDocument,但如果支持,请使用此算法(改编自DOMParser HTML扩展)。请注意,DOCTYPE将不会保留。var&nbsp; &nbsp; &nbsp; doc = document.implementation.createHTMLDocument("")&nbsp; &nbsp; , doc_elt = doc.documentElement&nbsp; &nbsp; , first_elt;doc_elt.innerHTML = your_html_here;first_elt = doc_elt.firstElementChild;if ( // are we dealing with an entire document or a fragment?&nbsp; &nbsp; &nbsp; &nbsp;doc_elt.childElementCount === 1&nbsp; &nbsp; && first_elt.tagName.toLowerCase() === "html") {&nbsp; &nbsp; doc.replaceChild(first_elt, doc_elt);}// doc is an HTML document// you can now reference stuff like doc.title, etc.
打开App,查看更多内容
随时随地看视频慕课网APP