如何从 JavaScript 访问父 iframe

IT技术 javascript iframe
2021-01-19 04:29:48

好吧,我有一个 IFrame,它调用同一个域页面。我的问题是我想从这个被调用的页面(来自 JavaScript)访问来自这个父 Iframe 的一些信息。如何访问此 Iframe?

详细信息:有几个 Iframe 就像这个一样,可以加载相同的页面,因为我正在编写 Windows 环境。我打算关闭这个 Iframe,这就是为什么我需要知道我应该从他内部关闭哪个。我有一个保存对这些 Iframe 的引用的数组。

编辑:动态生成 iframe

6个回答

您也可以将名称和 ID 设置为相等的值

<iframe id="frame1" name="frame1" src="any.html"></iframe>

这样您就可以在子页面中使用下一个代码

parent.document.getElementById(window.name);
如果未设置 CORS,Chrome 会查看与跨域相同文件夹中的文件。他们说这是为了安全。设置 CORS 需要一个服务器。如果检测到 Chrome,则向用户发送消息以设置服务器或更改浏览器。
2021-03-15 04:29:48
也许对每个人来说都不是很明显,但是通过这种方法您可以访问父级的库对象(仅当父级已经加载了该库时)。示例:使用 parent.$('#something') 访问 jQuery
2021-03-18 04:29:48
即使在 2016 年,这也是解决 IE 打印iframe太小的内容问题的一部分但它为什么有效?window.name返回一个字符串。使用window.name与仅将 id 名称作为不起作用的字符串传递有什么不同。)?
2021-03-19 04:29:48
本方案兼容IE5+兼容怪癖模式。
2021-03-30 04:29:48
您好,它不能与 Chrome 59 一起运行。:VM111:1 未捕获的 DOMException:阻止了一个具有“ xxx ”源的框架访问跨源框架。
2021-04-01 04:29:48

只需window.frameElement从您的框架页面调用如果页面是不是在一个框架,然后frameElementnull

另一种方式(在框架内获取 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;
}
@Qwerty 您找到任何解决方案了吗?
2021-03-11 04:29:48
window.frameElementnull当 window 和 iframe 具有不同的域时返回,即跨域消息传递。
2021-03-19 04:29:48
谢谢!适用于 IE 6+、FF 和 Chrome!
2021-03-23 04:29:48
@Qwerty 一种可能的解决方案是使用 iframe 作为“代理”在不同域的页面之间发送消息。例如,sysend.js使用 来做到这一点postMessage()
2021-03-26 04:29:48
@AjayPatidar 我想我放弃了。:(
2021-04-09 04:29:48

我建议使用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 的更多信息

@HomrZodyssey 父域仅作为安全机制可用,如果不知道,您可以设置'*'.
2021-03-13 04:29:48
<iframe> 仍然需要知道父域,对吗?
2021-03-30 04:29:48
我认为这显然是最好的答案,<iframe>内容不必了解父母的任何信息,反之亦然。他们只需要遵守简单的消息契约。惊人的!
2021-03-31 04:29:48
DOMException:阻止原点为“null”的框架访问跨源框架。
2021-03-31 04:29:48
'*'在客户端上使用其他所有解决方案都会在 Chrome 浏览器上出错,将客户端文件夹中的文件视为不同来源,因为未设置服务器。这是最好也是唯一的解决方案:dyn-web.com/tutorials/iframes/postmessage
2021-04-07 04:29:48

老问题,但我刚刚遇到了同样的问题,并找到了获取 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。

@AndrewMao 问题是关于同源文件的,所以没有理由遇到跨源问题。
2021-03-12 04:29:48
抱歉,不可否认,我只在 Firefox 中测试过它。:) 但是,我在多个浏览器中使用 jQuery 方法和 contentWindow 取得了成功。
2021-04-01 04:29:48
我认为这种类型的东西不再有效;你会得到一个跨域错误。
2021-04-05 04:29:48
更新:我发现您也可以使用 window.frameElement,但我不确定哪些浏览器支持它。
2021-04-06 04:29:48
更新:这并不完全像宣传的那样工作,我不得不使用 contentWindow.document===document。不知道为什么。同样在一些浏览器中,我使用了 contentDocument。嗯,我喜欢!
2021-04-07 04:29:48

您可以使用parent访问父页面。因此,要访问一个函数,它将是:

var obj = parent.getElementById('foo');
凯文,问题是要知道 id。我有几个 iframe,我想从里面的代码访问它们
2021-03-28 04:29:48
仍然会收到“阻止了一个带有源“ other-localhost:8000 ”的框架访问跨源框架。
2021-04-03 04:29:48
DOMException:阻止原点为“null”的框架访问跨源框架。
2021-04-06 04:29:48