如果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可以做更长的时间。
安全风险是有人利用和操纵它劫持你的一方。但如果有人想这么做,那么一切都有可能。
记住:生活会找到一条路…;-)