从主文档中的 JavaScript 获取 IFrame 的文档

发布于 2024-09-28 19:05:40 字数 815 浏览 4 评论 0原文

我有这个 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>

问题是我收到消息“Bad”。这意味着没有正确获取iframe的文档,而GetDoc函数实际返回的是父文档。

如果您告诉我我的错误在哪里,我将不胜感激。 (我想要将文档托管在 IFrame 中。)

谢谢。

I have this HTML code:

<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>

The problem is that I get message "Bad". That mean that the document of iframe is not got correctly, and what is actualy returned by GetDoc function is the parent document.

I would be thankful, if you told where I do my mistake. (I want to get document hosted in IFrame.)

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

横笛休吹塞上声 2024-10-05 19:05:40

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

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

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

You should be able to access the document in the IFRAME using the following code:

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

However, you will not be able to do this if the page in the frame is loaded from a different domain (such as google.com). This is because of the browser's Same Origin Policy.

<逆流佳人身旁 2024-10-05 19:05:40

问题是,在 IE 中(我猜你正在测试的是 IE), 元素有一个 document 属性,该属性引用包含以下内容的文档: iframe,并且它在 contentDocumentcontentWindow.document 属性之前使用。您需要的是:

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

此外,document.all 并非在所有浏览器中都可用并且是非标准的。请改用 document.getElementById()

The problem is that in IE (which is what I presume you're testing in), the <iframe> element has a document property that refers to the document containing the iframe, and this is getting used before the contentDocument or contentWindow.document properties. What you need is:

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

Also, document.all is not available in all browsers and is non-standard. Use document.getElementById() instead.

不弃不离 2024-10-05 19:05:40

如果您遇到跨域错误:

如果您可以控制 iframe 的内容 - 也就是说,如果它只是在跨域设置中加载,例如在 Amazon Mechanical Turk 上 - 您可以使用 < code> 内部 html 属性。

例如,对于内部 html,使用 this html 参数(是的 - this 已定义,它引用内部 body 元素的父窗口):

在内部 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>

In case you get a cross-domain error:

If you have control over the content of the iframe - that is, if it is merely loaded in a cross-origin setup such as on Amazon Mechanical Turk - you can circumvent this problem with the <body onload='my_func(my_arg)'> attribute for the inner html.

For example, for the inner html, use the this html parameter (yes - this is defined and it refers to the parent window of the inner body element):

<body onload='changeForm(this)'>

In the inner 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>
如日中天 2024-10-05 19:05:40

您还可以使用:

document.querySelector('iframe').contentDocument

You can also use:

document.querySelector('iframe').contentDocument
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文