获取对父IFRAME的引用

时间:2010-08-28 20:02:54

标签: javascript css dom iframe

假设我有一个文档对象的引用,它包含在IFRAME中。如何获得容器IFRAME的引用? .parentNode和.ownerDocument都返回null。

请注意,没有可用的上下文信息(例如'window.xxx'之类的解决方案不起作用) - 所有可用的都是对文档对象的引用。

由于

2 个答案:

答案 0 :(得分:12)

文档未直接连接到其父文档。您需要引用window才能获取parent

DOM Level 2 Views属性document.defaultView将在大多数现代Web浏览器中为您提供window,但在IE中您必须使用非标准document.parentWindow。 (一些较旧或较为模糊的浏览器不会实现这些属性中的任何一个,在这种情况下,您会被卡住。)

这将为您提供父文档的window。如果您想获得保存文档的<iframe>,则必须遍历页面上的所有iframe,并检查所包含的文档是否属于您自己。

同样,从iframe元素返回到子元素的方法在IE(iframe.contentWindow提供window)与DOM标准和其他所有人(iframe.contentDocument之间是无差异的。给你document)。

所以,比如:

function getFrameForDocument(document) {
    var w= document.defaultView || document.parentWindow;
    var frames= w.parent.document.getElementsByTagName('iframe');
    for (var i= frames.length; i-->0;) {
        var frame= frames[i];
        try {
            var d= frame.contentDocument || frame.contentWindow.document;
            if (d===document)
                return frame;
        } catch(e) {}
    }
}

try...是为了避免因文档访问因另一个iframe位于不同域而导致文档访问失败而导致环路崩溃,从而导致同源策略错误。)

答案 1 :(得分:1)

我用这个:

function get_container_iframe()
         {var rtn_iframe=null;
          var iframes=window.parent.document.getElementsByTagName('iframe');
          for (var i=0; i<iframes.length; ++i)
              {try
                   {var d=iframes[i].contentDocument || iframes[i].contentWindow.document || iframes[i].document; //ie | firefox etc | ie5
                    if (d===window.document)
                       {rtn_iframe=iframes[i];
                        break;
                       }
                   }
               catch(e) {}
              }
          return rtn_iframe;
         }