好吧,我有一个 IFrame,它调用同一个域页面。我的问题是我想从这个被调用的页面(来自 JavaScript)访问来自这个父 Iframe 的一些信息。如何访问此 Iframe?
详细信息:有几个 Iframe 就像这个一样,可以加载相同的页面,因为我正在编写 Windows 环境。我打算关闭这个 Iframe,这就是为什么我需要知道我应该从他内部关闭哪个。我有一个保存对这些 Iframe 的引用的数组。
编辑:动态生成 iframe
好吧,我有一个 IFrame,它调用同一个域页面。我的问题是我想从这个被调用的页面(来自 JavaScript)访问来自这个父 Iframe 的一些信息。如何访问此 Iframe?
详细信息:有几个 Iframe 就像这个一样,可以加载相同的页面,因为我正在编写 Windows 环境。我打算关闭这个 Iframe,这就是为什么我需要知道我应该从他内部关闭哪个。我有一个保存对这些 Iframe 的引用的数组。
编辑:动态生成 iframe
您也可以将名称和 ID 设置为相等的值
<iframe id="frame1" name="frame1" src="any.html"></iframe>
这样您就可以在子页面中使用下一个代码
parent.document.getElementById(window.name);
只需window.frameElement
从您的框架页面调用。如果页面是不是在一个框架,然后frameElement
会null
。
另一种方式(在框架内获取 window 元素不太简单),但为了完整起见:
/**
* @param f, iframe or frame element
* @return Window object inside the given frame
* @effect will append f to document.body if f not yet part of the DOM
* @see Window.frameElement
* @usage myFrame.document = getFramedWindow(myFrame).document;
*/
function getFramedWindow(f)
{
if(f.parentNode == null)
f = document.body.appendChild(f);
var w = (f.contentWindow || f.contentDocument);
if(w && w.nodeType && w.nodeType==9)
w = (w.defaultView || w.parentWindow);
return w;
}
我建议使用postMessage API。
在您的 iframe 中,调用:
window.parent.postMessage({message: 'Hello world'}, 'http://localhost/');
在包含 iframe 的页面中,您可以监听如下事件:
window.addEventListener('message', function(event) {
if(event.origin === 'http://localhost/')
{
alert('Received message: ' + event.data.message);
}
else
{
alert('Origin not allowed!');
}
}, false);
顺便说一句,还可以调用其他窗口,而不仅仅是 iframe。
在此处阅读 John Resigs 博客上有关 postMessage API 的更多信息
老问题,但我刚刚遇到了同样的问题,并找到了获取 iframe 的方法。这只是遍历父窗口的frames[] 数组并针对运行代码的窗口测试每个框架的contentWindow 的问题。例子:
var arrFrames = parent.document.getElementsByTagName("IFRAME");
for (var i = 0; i < arrFrames.length; i++) {
if (arrFrames[i].contentWindow === window) alert("yay!");
}
或者,使用 jQuery:
parent.$("iframe").each(function(iel, el) {
if(el.contentWindow === window) alert("got it");
});
此方法无需为每个 iframe 分配 ID,这在您的情况下很好,因为它们是动态创建的。我找不到更直接的方法,因为您无法使用 window.parent 获取 iframe 元素 - 它直接进入父窗口元素(跳过 iframe)。所以循环遍历它们似乎是唯一的方法,除非你想使用 ID。
您可以使用parent
访问父页面。因此,要访问一个函数,它将是:
var obj = parent.getElementById('foo');