iframe文档的实际树结构

时间:2015-07-28 02:03:43

标签: javascript html css iframe

我可能是错的,但关于iframe,我知道的就是这个 - 在iframe中它创建了它自己的文档对象。但是我很少有其他人混淆。 w3school's example says :

var x = document.getElementById("myframe");
var y = (x.contentWindow || x.contentDocument);
if (y.document)y = y.document;
y.body.style.backgroundColor = "red";
  

在说明中,contentDocument重新编译文档   iframe元素生成的对象。

如果是这样,那么为什么我们需要获得y.document的访问权限。我想说的是,如果x.contentDocument返回文档对象,那么为什么我们需要x.contentDocument.document来获得完整的对象。任何人都可以解释这个的实际 树结构 吗?

如果它是一个文档对象,那么为什么我在尝试提取放置在iframe中的div元素的innerHTML时出错?

<html>
<body>
<iframe style='bordre:1px solid black;width:100px;height:100px;' id='myframe'><div id='mydiv'>lol</div>></iframe>
<script>
    var x = document.getElementById("myframe");
var y = (x.contentWindow || x.contentDocument);
if (y.document)y = y.document;
console.log(y.document.getElementById('mydiv').innerHTML);
</script>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

您需要拥有2个单独的html文件。我们会将其称为parent.htmlchild.html。对于此示例,这两个文件将位于相同的域和子域中。

位置

虽然这个简单的树结构将两个文件都作为兄弟,但是当我们使用iframe时,带有iframe的文件称为父文件,iframe中的文件称为子文件。

parent.html

    <!Doctype html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Parent</title>
    </head>
    <body>

    <!--| border is spelled wrong, missing `src` attribute, there's an extra `>` at the end of the non-existent div |--> 
    <!--<iframe style='bordre:1px solid black;width:100px;height:100px;' id='myframe'><div id='mydiv'>lol</div>></iframe>--> 

    <!--| This is the proper way to create an iframe |-->
        <iframe id="myframe" name="myframe" scrolling="no" src="http://arcx.s3.amazonaws.com/demo1/child.html" style="border:1px solid black;width:100px;height:100px;">Anything inbetween the iframe tags will appear if the browser cannot render the iframe properly, so if the iframe is done correctly, anything here will never get rendered</iframe>
        <script>
/* When the iframe is loaded, get Child's #mydiv HTML content and log it to the console */
            var iFrame = document.getElementById("myframe"); // Reference to iframe
            iFrame.onload = function() {
                var childWin = iFrame.contentWindow, // Reference to child.html window 
                        target = childWin.document.getElementById('mydiv'), // Reference to child's div
                     /* target =  childWin.document.querySelector('div'), */// Alternate reference to child's div
                        content = target.innerHTML; // Get div's content
                console.log(content);
            }
        </script>
    </body>
    </html>

child.html

<!Doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Child</title>
    <style>
        #mydiv { outline: 2px dashed red; background: black; width: 84px; height: 84px; font: 900 32px/1.5 Consolas; text-align: center; color: red; margin: 2px; }
    </style>
</head>
<body>
    <div id="mydiv">LOL</div>
</body>
</html>

这里是Tutorial