从单独的iframe重新加载iframe

时间:2013-10-25 14:47:50

标签: javascript iframe parent reload

我已经在stackoverflow上检查了来自另一个iframe帖子的所有重新加载iframe ...我已经尝试了所有他们的解决方案,但它似乎没有帮助我!所以我的问题是我在同一页面上有两个iframe。 iframe的源代码是互相交互的php文件,但我需要iframes重新加载,以便显示更改。我尝试了很多不同的方法(我将在下面列出)。这些iframe来自同一个域。也许是其他东西弄乱了这个?提前谢谢。

从一个iframe内部调用的不同语句:

parent.document.getElementById(id).src = parent.document.getElementById(id).src;
parent.getElementById(id).location.reload();

尝试调用在父窗口中工作的父函数:

内部iframe -

parent.refresh(id);

父窗口工作功能 -

function refresh(id) {
document.getElementById(id).src = document.getElementById(id).src;
}

1 个答案:

答案 0 :(得分:7)

如果您将name分配给iframe,大多数浏览器都会允许您通过iframe值访问window的{​​{1}}对象。这与通过name属性引用iframe不同,后者将为您提供对id元素本身(来自其所有者iframe)的引用,而不是{ {1}}的内容document

简单示例:(来自父文档)

iframe

让我们检查您的代码:

window

如果您使用正确的<iframe name='iframe1Name' id='iframe1Id'></iframe> <script> // option 1: get a reference to the iframe element: var iframeElem = document.getElementById('iframe1Id'); // update the element's src: iframeElem.src = "page.html"; // option 2: get a reference to the iframe's window object: var iframeWindow = window.iframe1Name; // update the iframe's location: iframeWindow.location.href = "page.html"; </script> ,则可以在parent.document.getElementById(id).src = parent.document.getElementById(id).src; 内执行。您可能希望使用调试器来验证iframe是否返回对正确元素的引用,并检查控制台以查看是否抛出任何异常(尝试按F12)。由于你没有发布你的完整代码(包括标记),我无法想到告诉你这里的问题是什么。

调试提示:

  • 检查id以确保您访问的是您认为自己的窗口,
  • 检查parent.document.getElementById(id)以确保您获得了一个元素对象(而不是parent.location.hrefparent.document.getElementId(id)),
  • 检查null以确保您使用的是正确的ID(undefined = =“IFRAME”)

这一行:

parent.document.getElementById(id).tagName

有两个问题:

  1. tagNameparent.getElementById(id).location.reload(); 的函数,但它是从getElementById()调用的document对象,
  2. parentwindow对象的属性。您正在尝试访问不存在的location元素的window属性。您需要引用iframe的{​​{1}},而不是其元素。
  3. location方法外,还有其他方法可以获取iframe的窗口对象:

    1. window
    2. name
    3. iframe
    4. 如果更改document.getElementById('iframeId').contentWindow; // for supported browsers元素的window.frames["iframeName"]; // assumes name property was set on the iframe不适合您,则这些其他修补程序可能会:

      window.frames[i]; // where i is the ordinal for the frame

      src

      iframe

      parent.document.getElementById(id).contentWindow.location.reload();

      警告:如果使用parent.frames["yourIframeName"].location.reload(); // requires iframe name attribute方法,请注意不要使用parent.frames[0].location.reload(); // frames of immediate parent window的公共值,例如“home”,因为它与名为top.frames[0].location.reload(); // frames of top-most parent window的FireFox函数冲突因此,如果名为name,Firefox将不会自动创建对iframe窗口的引用。最可靠的方法可能是使用name因为我相信已经存在了很长时间(适用于FF / Chrome / Safari / IE6 +(至少))

      在Chrome,FF和IE中测试了一个更深入(但非常小)的示例:

      文件#1:frametest.html(父窗口)

      home()

      文件#2:frame1.html(第1帧的src)

      home

      文件#3:frame2.html(第2帧的src)

      window.frames[]

      此示例演示了如何按<!DOCTYPE html> <html> <body> <iframe id="frame1Id" name="frame1Name" src="frame1.html"></iframe> <iframe id="frame2Id" name="frame2Name" src="frame2.html"></iframe> </body> </html> <!DOCTYPE html> <html> <body> FRAME 1 <script> document.body.style.backgroundColor="#ccc"; setTimeout(function(){document.body.style.backgroundColor="#fff";},100); document.write(new Date()); </script> <input type="button" onclick="parent.document.getElementById('frame2Id').src=parent.document.getElementById('frame2Id').src;" value="Refresh frame 2 by ID"/> <input type="button" onclick="parent.frame2Name.location.reload();" value="Refresh frame 2 by Name"/> </body> </html> 定义和操作<!DOCTYPE html> <html> <body> FRAME 1 <script> document.body.style.backgroundColor="#ccc"; setTimeout(function(){document.body.style.backgroundColor="#fff";},100); document.write(new Date()); </script> <input type="button" onclick="parent.document.getElementById('frame1Id').src=parent.document.getElementById('frame1Id').src;" value="Refresh frame 2 by ID"/> <input type="button" onclick="parent.frame1Name.location.reload();" value="Refresh frame 2 by Name"/> </body> </html> ,以及如何在不同的iframe内定义和操作id 。根据浏览器设置,原始政策可能适用,但您已经说过您的内容全部来自同一个域,因此您应该可以。