这有点复杂,请耐心等待。 网站A的iframe包含网站B,网站B的iframe包含网站C.
网站C上有一个按钮,点击后,我想刷新网站B的网址。下面是调用网页C的网站B刷新的javascript,这是在iframe中
function url_update(id){
var host = 'https://websiteb.com ';
var myHost = host.split('/');
if (id != "" && myHost != ""){
try {
if (id.substring(0,1) != '/'){
id = '/' + id;
}
var dft_url = myHost[0] + '//' + myHost[2] + id;
window.parent.location.href = dft_url;
} catch(e){alert("Cannot go to the desired url location: " + dft_url);}
}
}
但是当行“window.parent.location.href = dft_url;”时被执行,我收到以下错误:
Unsafe JavaScript attempt to initiate navigation for frame with URL
'https://websiteB.com' from frame with URL
'https://websiteC.com'. The frame attempting navigation is
neither same-origin with the target, nor is it the target's parent or
opener.
我不明白为什么会发生这种情况以及如何解决这个问题。任何帮助将不胜感激。
我做了一些研究,大多数人声称这是一个原始问题,但是如果我拿出网站A,意思是网站B只有一个包含网站C的iframe,那么上面的代码就可以了。即使他们有不同的域名
答案 0 :(得分:11)
您可以在Chromium源代码的注释中找到有关此行为的说明。见这里:
基本上,顶级窗口对导航的限制比其他窗口少。请参阅非顶部窗口的限制:
文档可以导航其后代帧,或者更一般地,a 如果文档与原始文件相同,则文档可以导航 任何一个框架的祖先(在框架层次结构中)。
顶窗的位置:
具体而言,文档可以导航顶层框架(如果该框架) 打开文档或文档是同一个来源的任何一个 顶级框架的开启者的祖先(在框架层次结构中)。
原因是:
顶级框架比其他框架更容易导航,因为它们 在地址栏中显示他们的URL(在大多数浏览器中)。
所以基本上,对于非顶部窗口,它绝对需要是相同的原点以允许导航,但对于顶部窗口,由该窗口打开的框架可以导航,即使它不是同源的。这似乎是你所面临的问题,当B是顶级的时候,同一个起源不适用,但是当它不是顶级时,则适用。
根据这一点,我不确定是否有直截了当或根本没有解决方案。
答案 1 :(得分:0)
我知道这个老问题,但我来到这里是因为我有同样的问题。我在我的 sandbox
中使用 iframe
属性解决了我的问题:
var iframe = document.createElement('iframe');
iframe.setAttribute("sandbox", "allow-scripts allow-top-navigation");
var html = '<body><script>window.top.location="https://redirectDomain.tld";</script></body>';
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
document.body.appendChild(iframe);
您可以从来源阅读更多信息:
Creating an iframe with given HTML dynamically
Frames and Windows