从iframe访问父窗口(跨域)
Access parent window from iframe (cross-domain)
如果iFrame中的窗口是从另一个域加载的,那么我遇到了从iFrame访问父窗口的任务。如果我理解正确的话,现在所有的现代浏览器都允许这样做。所以我来这里是为了找到最好的解决方案。
我将以下一种方式完成:
我有一个覆盖层,里面有一个iFrame。这将代替弹出窗口,防止弹出窗口阻止程序阻止我的内容。任务是在iFrame中的文档完成某些工作时重新加载主页面。在将加载到iFrame的文档中,我将添加
<div id="is_closed" class="false"></div>
在父窗口中,我将添加函数,该函数将每秒调用一次,并检查该div是否仍有类名"false"。当这将更改为"true"时,我将调用一些回调。
如果你有更好的解决方案,请与我分享。如果有任何帮助,我们将不胜感激。
编辑:这是不可能的,因为它不仅不可能从子窗口操作父窗口,而且反之亦然。我的想法是从父窗口操作子窗口。我错了。
如果我是你,我会查看window.postMessage。它可以做你想做的事:
参考如下:
- MDN-Window.postMessage
- https://stackoverflow.com/a/3076648/296889-请参阅Window.postMessage部分
如果我理解正确的话,现在所有的现代浏览器都允许这样做。所以我来这里是为了找到最好的解决方案。
此是您的解决方案。你的要求是不可能的。
参见相关问题:
- 如何从JavaScript访问父Iframe
- <iframe>javascript跨域访问父DOM
- iframe中从子级到父级的跨域访问
编辑
正如下面的评论中所提到的,@JeremysAwesome的回答提供了一种在特定情况下允许跨域请求的方法。有关更多信息,请参阅下面的SO问题。
规避同源策略的方法
但您可以更改iframe
的src
属性(例如添加#hashtag
)并在子窗口中侦听onhashchange
事件。考虑到您可以同时更改两个页面。
另一种方法是:在加载后500毫秒将iframes-src设置为javascript:
链接。示例:
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
等域上的网站时非常好,因为这些域不允许您轻松更改此类内容。。。
现在很明显,您仍然需要启动window.postMessage
,更多信息可以在@jeremysawsome的回答
在sessionStorage中设置一个变量/项,并根据需要在两侧使用它。localStorage可以做更长的时间。
安全风险是有人利用和操纵它劫持你的一方。但如果有人想这么做,那么一切都有可能。
记住:生活会找到一条路…;-)
- 检测iframe是否跨域的愚蠢方法
- 如何使用自定义标头跨域执行AJAX POST
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- 跨域ajax请求
- Facebook的“赞”按钮如何具有跨域访问权限,可以将HTML添加到父窗口
- 跨域上的 iframe 与窗口通信
- 从iframe访问父窗口(跨域)
- 跨域窗口.从父窗口关闭事件
- IFrame弹出菜单“;窗口”;,显示&隐藏,跨域
- 跨域弹出窗口
- 错误跨域iframe尝试访问父窗口中元素的属性时失败
- 窗口.打开跨域调用使用javascript
- 通过javascript在父窗口中跨域和协议访问子窗口的元素
- 一个弹出窗口如何改变其父跨域的页面位置?
- Javascript跨域通信到iframe的父窗口
- ie9跨域窗口.不支持这样的接口
- 窗口.开瓶器跨域呼叫
- 通过对服务器的初步 CORS 调用来保证跨域窗口的源(父 URL).打开程序调用
- 从iframe传递消息到父窗口(跨域)
- iFrame窗口高度跨域(请求从主机网站)