Цикл на узлах документа (включая детей) - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь заменить «document.write» внутри iframe, который содержит рекламу. В настоящее время я анализирую строку html через "DOMParser" и получаю взамен документ dom, я хотел бы зациклить этот документ и вставить каждый узел и все дочерние элементы в реальный iframe dom. Но я столкнулся с двумя проблемами: 1.Если строка из исходного document.write не содержит <head><html><body>, API «DOMParser» добавляет их в любом случае. 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>'

и мы используем console.log(node); внутри цикла for, результат будет:

https://ibb.co/hxzDc8

как вы можете видеть в первой итерации, узел - это весь тег html, включая все дочерние элементы (тело головы ...), вторая - это только голова, а не только сценарий внутри головы, а не все тело и только div внутри тела. так что это совсем не хорошо для меня, мне нужно разобрать строку как документ и начать добавлять узлы в правильном порядке в iframe вот и все

Новый код:

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

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