Я пытаюсь заменить «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);
});