为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英3389331 2019-10-11 11:14:06
这是我遇到的一些困难。我有一个本地客户端脚本,该脚本需要允许用户获取远程网页并在结果页面中搜索表单。为了做到这一点(不使用正则表达式),我需要将文档解析为一个完全可遍历的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 fragmentdiv.insertAdjacentHTML("afterEnd", html);//-> HTML is not added to the fragmentdiv.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>片段中的元素中,仍然没有运气。有人有什么想法吗?
查看完整描述

3 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

不确定为什么要弄乱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) {

    var range = document.createRange();

    var frag = range.createContextualFragment(htmlText);

    var d = document.createElement('div');

    d.appendChild(frag);

    return d;

}


查看完整回答
反对 回复 2019-10-11
?
长风秋雁

TA贡献1757条经验 获得超7个赞

我不确定IE是否支持document.implementation.createHTMLDocument,但如果支持,请使用此算法(改编自DOMParser HTML扩展)。请注意,DOCTYPE将不会保留。


var

      doc = document.implementation.createHTMLDocument("")

    , doc_elt = doc.documentElement

    , first_elt

;

doc_elt.innerHTML = your_html_here;

first_elt = doc_elt.firstElementChild;

if ( // are we dealing with an entire document or a fragment?

       doc_elt.childElementCount === 1

    && first_elt.tagName.toLowerCase() === "html"

) {

    doc.replaceChild(first_elt, doc_elt);

}


// doc is an HTML document

// you can now reference stuff like doc.title, etc.


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 422 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信