重复iframe:将头部和身体从1个iframe复制到另一个iframe

时间:2012-03-29 17:35:58

标签: javascript

我似乎无法找到答案的简单问题: 我在页面上有两个iframe,我想将第一个内容复制到第二个。 但是我不能通过将第一个iframe的url复制到第二个来实现,因为包含的页面是动态的。

这段代码确实做到了,但很多页面格式似乎都迷失了。而且我不知道它是否也是跨浏览器。

iframe2.contentWindow.document.write(iframe1.contentWindow.document.body.innerHTML);

可以这样做吗?

1 个答案:

答案 0 :(得分:1)

提出的原生JavaScript解决方案:

首先,为了简单起见,我创建了2个对象文字:

var iframe1 = {

    doc     : undefined,
    head    : undefined,
    body    : undefined

};

var iframe2 = {

    doc     : undefined,
    head    : undefined,
    body    : undefined

};

接下来,我将所有内容放在iframe1的window.onload处理程序下,以确保它已完全加载:

document.getElementById("iframe1").contentWindow.onload = function() { 

然后我分配了所有对象文字属性:

    iframe1.doc = document.getElementById("iframe1").contentWindow.document;
    iframe1.head = iframe1.doc.getElementsByTagName("head")[0];
    iframe1.body = iframe1.doc.getElementsByTagName("body")[0];

    iframe2.doc = document.getElementById("iframe2").contentWindow.document;
    iframe2.head = iframe2.doc.getElementsByTagName("head")[0];
    iframe2.body = iframe2.doc.getElementsByTagName("body")[0];

接下来,我需要创建一些函数removeNodes()appendNodes(),以便我可以重新考虑一些用于<head><body>例程的代码。

    function removeNodes(node) {

        while (node.firstChild) { 

            console.log("removing: " + node.firstChild.nodeName);
            node.removeChild(node.firstChild); 

        } 
    }

    function appendNodes(iframe1Node, iframe2Node) {

        var child = iframe1Node.firstChild;
        while (child) { 

        if (child.nodeType === Node.ELEMENT_NODE) { 

            console.log("appending: " + child.nodeName);

            if (child.nodeName === "SCRIPT") {

                // We need to create the script element the old-fashioned way
                // and append it to the DOM for IE to recognize it.

                var script = iframe2.doc.createElement("script");
                script.type = child.type;
                script.src = child.src;

                iframe2Node.appendChild(script);

            } else { 

                // Otherwise, we append it the regular way. Note that we are
                // using importNode() here. This is the proper way to create                        
                // a copy of a node from an external document that can be 
                // inserted into the current document. For more, visit MDN:
                // https://developer.mozilla.org/en/DOM/document.importNode

                iframe2Node.appendChild(iframe2.doc.importNode(child, true)); 
            } 
        }

        child = child.nextSibling;
    }

创建这些功能后,现在我们所要做的就是拨打电话:

    console.log("begin removing <head> nodes of iframe2");
    removeNodes(iframe2.head);

    console.log("begin removing <body> nodes of iframe2");  
    removeNodes(iframe2.body);

    console.log("begin appending <head> nodes of iframe1 to iframe2");
    appendNodes(iframe1.head, iframe2.head);

    console.log("begin appending <body> nodes of iframe1 to iframe2");
    appendNodes(iframe1.body, iframe2.body);

...最后,我们关闭了window.onload函数:

};