Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从iframe访问父窗口(跨域)_Javascript_Html_Iframe_Cross Domain - Fatal编程技术网

Javascript 从iframe访问父窗口(跨域)

Javascript 从iframe访问父窗口(跨域),javascript,html,iframe,cross-domain,Javascript,Html,Iframe,Cross Domain,我遇到了从iFrame访问父窗口的任务,如果iFrame中的窗口是从另一个域加载的。如果我理解正确的话,所有现代浏览器现在都允许这样做。所以我来这里是为了找到最好的解决方案 我将用下一种方法来实现这一点: 我有一个覆盖层,里面有一个iFrame。这将取代弹出窗口,以防止弹出窗口拦截器阻止我的内容。任务是在iFrame中的文档完成某些工作后重新加载主页面。 在将加载到iFrame的文档中,我将添加 <div id="is_closed" class="false"></div&g

我遇到了从iFrame访问父窗口的任务,如果iFrame中的窗口是从另一个域加载的。如果我理解正确的话,所有现代浏览器现在都允许这样做。所以我来这里是为了找到最好的解决方案

我将用下一种方法来实现这一点:

我有一个覆盖层,里面有一个iFrame。这将取代弹出窗口,以防止弹出窗口拦截器阻止我的内容。任务是在iFrame中的文档完成某些工作后重新加载主页面。 在将加载到iFrame的文档中,我将添加

<div id="is_closed" class="false"></div>

在父窗口中,我将添加函数,该函数将每秒调用一次,并检查该div是否仍然具有类名“false”。当这将更改为“true”时,我将调用一些回调

如果你有更好的解决方案,请与我分享。谢谢你的帮助

编辑:这是不可能的,因为不仅无法从子窗口操纵父窗口,而且也无法从子窗口操纵父窗口。我的想法是从父窗口操纵子窗口。我错了

如果我理解正确的话,所有现代浏览器现在都允许这样做。所以我来这里是为了找到最好的解决方案

这是您的解决方案。你的要求是不可能的

见相关问题:

编辑

正如下面的评论中所提到的,提供了一种在特定情况下允许跨域请求的方法。有关更多信息,请参见下面的SO问题


但是您可以更改
iframe
src
属性(例如添加
#hashtag
),并在子窗口中收听
onhashchange
事件。鉴于您可以同时更改这两个页面。

如果我是您,我会查看window.postMessage。它可以做你想做的事情:

有关参考信息,请参见以下内容:

  • -请参阅Window.postMessage部分

在会话存储中设置一个变量/项,并根据需要在两侧使用它。 localStorage可以执行更长的时间

安全风险是有人利用和操纵它来劫持你的一方。但是,如果有人想这样做的话,总有一种可能性


记住:生活会找到一条路…;-)

另一种方法是:在加载iframes src 500毫秒后将其设置为
javascript:
link。例如:

setTimeout(function() {
  document.getElementsByTagName("iframe")[0].src = `javascript: 
      (function(){
          setInterval(function() {
          if (document.getElementById("is_closed").className.match(/true/g)) {
              ...//see @jeremysawesome on how to do window.postMessage
          }
      })()`
}, 500);
尽管@jeremysawesome的答案确实有效,但无论宿主域是什么,它都能在嵌入式iframe上工作,这在处理诸如
blogspot.com
等域上托管的网站时非常有用,这些域不允许您轻松更改此类内容


现在,显然您仍然需要启动
窗口。postMessage
,更多信息可以在
上找到。如果我理解正确,所有现代浏览器现在都允许这样做。所以我来这里是为了找到最好的解决方案。
这是您的解决方案。你所问的是不可能的。
postMessage
在不同域的Iframe中工作。马尔金:如果这是可能的,任何Iframe内容都可能劫持托管页面。这是故意禁用的。没有解决办法,没有“最佳解决方案”。我知道这是不可能从子窗口操纵父窗口的。我要找的是如何模仿这种操作。换句话说,从父窗口运行某段代码的子窗口中的一些标志就可以了。@Malgin,同样,这是不可能的。您要求在页面之间进行脚本级别的交互。这是不可能的。你不能模仿不能做的事情。有很多问题需要解决。请参阅编辑。从您的回答中,我唯一不清楚的是,也不可能从父窗口操纵子窗口。这是我的想法,使我更加坚持。再次感谢。不过,您可以更改窗口位置。如果您知道有问题的URL并控制这两个域,那么您可能可以使用查询字符串在这两个域之间发送消息。听起来你应该寻求更好的解决方案。正如其他人所指出的,这实际上是可能的,例如通过postMessage。所以@jeremysawesome答案应该是被接受的,这是正确的答案。在HTML5中,现在可以使用Window.postMessage在窗口(或iFrame)之间进行跨域js调用。但在IEWindow.postMessage是一种方法。。。但是,您并不总是可以访问子iframes代码!所以,如果你把你的答案和我的结合起来,你就有了一个完全有效的解决方案!问题是跨域访问。您不能跨域访问本地存储/会话存储?如果您知道变量的名称,您可以跨域使用它。我的回答允许您在不控制两个页面的情况下执行此操作!