假设我有一个文档对象的引用,它包含在IFRAME中。如何获得容器IFRAME的引用? .parentNode和.ownerDocument都返回null。
请注意,没有可用的上下文信息(例如'window.xxx'之类的解决方案不起作用) - 所有可用的都是对文档对象的引用。
由于
答案 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;
}