如果iFrame中的窗口是从另一个域加载的,我遇到了从iFrame访问父窗口的任务。如果我理解正确,现在所有现代浏览器都允许这样做。所以我在这里找到最好的解决方案。
我将以下一个方式完成:
我在其中有一个带有iFrame的叠加层。这将有效,而不是弹出窗口阻止弹出窗口阻止程序阻止我的内容。任务是在iFrame中的文档完成某些工作时重新加载主页面。 在将加载到iFrame的文档中,我将添加
<div id="is_closed" class="false"></div>
在父窗口中,我将添加函数,该函数将每秒调用一次并检查此div是否仍具有类名“false”。如果将其更改为“true”,我将调用一些回调。
如果您有更好的解决方案,请与我分享。将不胜感激任何帮助。
编辑:这是不可能的,因为不仅无法从子窗口操作父窗口,反之亦然。我的想法是从父窗口操纵子窗口。我错了。
答案 0 :(得分:41)
如果我是你,我会查看window.postMessage。它可能会做你想要的:
供参考,请参阅以下内容:
答案 1 :(得分:12)
如果我理解正确,现在所有现代浏览器都允许这样做。所以我在这里找到最佳解决方案。
是 您的解决方案。你不能问的是什么。
参见相关问题:
修改强>
如下面的评论所述,@JeremysAwesome's answer提供了一种在某些情况下允许跨域请求的方法。有关详细信息,请参阅下面的SO问题。
答案 2 :(得分:7)
但您可以更改src
的{{1}}属性(例如添加iframe
)并在子窗口中收听#hashtag
事件。鉴于您有能力更改两个页面。
答案 3 :(得分:0)
另一种方法是:在加载iframe src后将其设置为javascript:
链接500-ish毫秒。示例:
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
,有关更多信息,请访问@jeremysawesome 's answer
答案 4 :(得分:-4)
在sessionStorage中设置变量/项目,并根据需要在两侧使用它。 localStorage可以做更长的时间。
安全风险是有人使用并操纵它来劫持你的一方。但如果有人想这样做 - 总会有可能。
记住:生活找到了方法......; - )