在文档节点上循环(包括子节点)

时间:2018-06-28 07:05:03

标签: javascript html dom document.write

我正在尝试在包含广告的iframe中替换“ document.write”。 我目前正在通过“ DOMParser”解析html字符串,并且得到了dom文档作为回报,我想在此文档上循环并将每个节点和所有子元素插入到真正的iframe dom中。 但是我遇到了两个问题: 1.如果原始document.write中的字符串不包含<head><html><body>,则“ DOMParser” API仍会添加它们。 2.i可以在所有节点上像这样循环:

ParsedHtml.querySelectorAll("*").forEach(function(node) {

但是我第一次迭代<html>节点,所有节点均为子节点,而<body>节点再次具有所有子节点,当迭代继续时,我将相同的节点。 因此,我真正想做的是解析document.write中的字符串,并开始以正确的顺序将节点(包括所有子节点)直接插入到iframe dom中(首先是主体...) 谢谢!

代码示例:

var RealDocumentWrite = document.write;
document.write = function(str){
//call our parser here instead of using document.write
}
//our parser:
function Parser(str){
var parser = new DOMParser();
ParsedHtml = parser.parseFromString(str, "text/html");
ParsedHtml.querySelectorAll("*").forEach(function(node) {
//in this for loop the problems that i specified above occur
}

示例执行: 如果我们输入的是:

var samplehtml = '<html><head><script>console.log(1);</script></head><body><div id="111"></div></body></html>'

,我们在for循环中使用console.log(node);,输出将是:

https://ibb.co/hxzDc8

正如您在第一次迭代中看到的那样,节点是整个html标记,包括所有子项(head body ...)。第二个仅是head,而不仅是head内部的脚本,还包括整个body和div体内。 所以那对我根本不好,我需要将字符串解析为文档,然后开始以正确的顺序将节点附加到iframe上,

新代码:

 ParsedHtml.querySelectorAll("head > *").forEach(function(node) {
        IframeDoc.head.appendChild(node);
    });

    ParsedHtml.querySelectorAll("body > *").forEach(function(node) {
        IframeDoc.body.appendChild(node);
    });

0 个答案:

没有答案