从主文档中的javascript获取iframe的文档

83qze16e  于 2021-09-23  发布在  Java
关注(0)|答案(3)|浏览(360)

我有以下html代码:

<html>
  <head>
    <script type="text/javascript">
      function GetDoc(x)
      {
        return x.document ||
          x.contentDocument ||
          x.contentWindow.document;
      }

      function DoStuff()
      {
        var fr = document.all["myframe"];
        while(fr.ariaBusy) { }
        var doc = GetDoc(fr);
        if (doc == document)
          alert("Bad");
        else 
          alert("Good");
      }
    </script>
  </head>
  <body>
    <iframe id="myframe" src="http://example.com" width="100%" height="100%" onload="DoStuff()"></iframe>
  </body>
</html>

问题是我收到了“坏”的信息。这意味着iframe的文档没有正确获取,getdoc函数实际返回的是父文档。
如果你能告诉我哪里出了错,我将不胜感激(我希望将文档托管在iframe中。)
非常感谢。

epfja78i

epfja78i1#

您应该能够使用以下代码访问iframe中的文档:

document.getElementById('myframe').contentWindow.document

但是,如果框架中的页面是从其他域(如google.com)加载的,则无法执行此操作。这是因为浏览器的同源策略。

hlswsv35

hlswsv352#

问题是,在ie中(我猜您正在测试的是ie) <iframe> 元素有一个 document 属性,该属性引用包含iframe的文档,并且在 contentDocumentcontentWindow.document 财产。您需要的是:

function GetDoc(x) {
    return x.contentDocument || x.contentWindow.document;
}

也, document.all 并非在所有浏览器中都可用,并且是非标准的。使用 document.getElementById() 相反

slmsl1lt

slmsl1lt3#

如果您遇到跨域错误:
如果您可以控制iframe的内容,也就是说,如果它只是在跨源设置中加载,比如在amazon mechanical turk上,那么您可以通过 <body onload='my_func(my_arg)'> 属性,该属性用于内部html。
例如,对于内部html,使用 this html参数(是- this 已定义,并引用内部主体元素的父窗口): <body onload='changeForm(this)'> 在内部html中:

function changeForm(window) {
        console.log('inner window loaded: do whatever you want with the inner html');
        window.document.getElementById('mturk_form').style.display = 'none';
    </script>

相关问题