我正在尝试在包含广告的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);
,输出将是:
正如您在第一次迭代中看到的那样,节点是整个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);
});