获取iframe的文档对象

时间:2011-09-27 14:05:28

标签: javascript dom iframe

我正在尝试获取iframe的文档对象,但我用google搜索的示例似乎都没有帮助。我的代码如下所示:

<html>
    <head>
        <script>
            function myFunc(){
                alert("I'm getting this far");
                var doc=document.getElementById("frame").document;
                alert("document is undefined: "+doc);
            }
        </script>
    </head>
    <body>
        <iframe src="http://www.google.com/ncr" id="frame" width="100%" height="100%" onload="myFync()"></iframe>
    </body>
</html>

我已经测试过我能够获取iframe对象,但是.document不起作用,.contentDocument和我认为我也测试过其他一些选项,但是所有这些选项都返回undefined,甚至是本来应该有用,但他们不适合我。所以我已经有了iframe对象,现在我想要的只是它的文档对象。我在Firefox和Chrome上测试过这一点无济于事。

4 个答案:

答案 0 :(得分:66)

尝试以下

var doc=document.getElementById("frame").contentDocument;

// Earlier versions of IE or IE8+ where !DOCTYPE is not specified
var doc=document.getElementById("frame").contentWindow.document;

注意:AndyE指出所有主流浏览器都支持contentWindow,所以这可能是最好的方法。

注意2:在此示例中,您将无法通过任何方式访问该文档。原因是您无法访问具有不同来源的iframe文档,因为它违反了“同源”安全策略

答案 1 :(得分:6)

这是我使用的代码:

var ifrm = document.getElementById('myFrame');
ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
ifrm.document.open();
ifrm.document.write('Hello World!');
ifrm.document.close();
  

contentWindow与contentDocument

     
      
  • IE(Win)和Mozilla(1.7)将返回内部的窗口对象   iframe与oIFrame.contentWindow。
  •   
  • Safari(1.2.4)不了解该属性,但确实有   oIframe.contentDocument,指向里面的文档对象   iframe。
  •   
  • 为了使它变得更加复杂,Opera 7使用了   oIframe.contentDocument,但它指向的是window对象   iframe中。因为Safari无法直接访问窗口对象   通过标准DOM(或者是吗?)的iframe元素,我们完全   现代跨浏览器兼容的代码只能访问   iframe中的文档。
  •   

答案 2 :(得分:6)

更强大:

function getIframeWindow(iframe_object) {
  var doc;

  if (iframe_object.contentWindow) {
    return iframe_object.contentWindow;
  }

  if (iframe_object.window) {
    return iframe_object.window;
  } 

  if (!doc && iframe_object.contentDocument) {
    doc = iframe_object.contentDocument;
  } 

  if (!doc && iframe_object.document) {
    doc = iframe_object.document;
  }

  if (doc && doc.defaultView) {
   return doc.defaultView;
  }

  if (doc && doc.parentWindow) {
    return doc.parentWindow;
  }

  return undefined;
}

...
var el = document.getElementById('targetFrame');

var frame_win = getIframeWindow(el);

if (frame_win) {
  frame_win.targetFunction();
  ...
}
...

答案 3 :(得分:0)

就我而言,这是由于Same Origin策略所致。为了进一步解释,MDN声明以下内容:

如果iframe和iframe的父文档是Same Origin,则返回一个Document(即,内联框架的嵌套浏览上下文中的活动文档),否则返回null。