Javascript “邮件发送后”;“封闭框架”;错误,但仅在Safari中

Javascript “邮件发送后”;“封闭框架”;错误,但仅在Safari中,javascript,iframe,safari,Javascript,Iframe,Safari,我使用postMessage在(我称之为mainSite)和(我称之为subSite)之间共享数据 子网站与主网站之间有一个iframe 子网站的代码类似于: //设置iframe的src $(“#主站点iframe”).attr(“src”,”https://www.example.com"); //等待主页面打开 $(“#主站点iframe”)[0]。onload=()=>{ //我的页面向他们的站点发布消息 $(“#我的iframe”)[0].contentWindow.postMessa

我使用postMessage在(我称之为mainSite)和(我称之为subSite)之间共享数据

子网站与主网站之间有一个iframe

子网站的代码类似于:

//设置iframe的src
$(“#主站点iframe”).attr(“src”,”https://www.example.com");
//等待主页面打开
$(“#主站点iframe”)[0]。onload=()=>{
//我的页面向他们的站点发布消息
$(“#我的iframe”)[0].contentWindow.postMessage(“messagePlox,”https://www.example.com");  
};
//等待iframe返回消息
addEventListener('message',iframesponse,false);
函数iframeResponse(e){
//确保请求来自正确的站点
如果(e.origin=='https://www.example.com')
{
//得到数据了吗
控制台日志(如数据);
}
}
主站点如下所示:

//listen for the subdomain to make a request
window.addEventListener('message', subdomainRequest, false);
function subdomainRequest(e) {
    //make sure the request is from the correct subdomain
    if(e.origin == 'https://subdomain.example.com')
    {
        //respond with the data
        e.source.postMessage("We got you", e.origin);
    }
}
上面提到的问题是,除了Safari之外,它在所有浏览器中都能正常工作,Safari拒绝了它并说:

阻止原点为“”的帧访问原点为“”的帧。协议、域和端口必须匹配

这似乎意味着,由于主站点正试图“访问”子网站,回复正在中断


有人知道为什么这只会发生在Safari中,而不会发生在Firefox或Chrome中吗?

双向跨域通信通常在Safari/Opera中被阻止。解决这个问题的主要方法是使用父母和孩子都同意的网关。。。但他们不能使用IPC使用无网络消息进行双向通信。另外,Nitro JS引擎团队也会密切关注一些例外情况,如果您有一个较大的iFrame,并且用户正在与之交互,则来自父级的消息将通过,反之亦然

来自父级的消息会像在软件中一样被处理。。。也就是说,不要期望事情在处理程序中正常工作。。。测试了很多。例如,我的承诺解析函数由于某种原因无法从消息处理函数调用。。。这意味着我必须检查函数是否在超时时被调用,使事情变得非常缓慢

如果您只需要显示来自孩子的成功消息,您可以执行以下操作:

parent.sendSuccessMsg();

function sendSuccessMsg(){
    document.getElementById('iframeID').src="http://example.com/?successData=123";
}
否则,您可以使用带有网关的WebSocket来跨域混合。如果您两次加载iFrame,并且消息在iFrame加载的早期发送,则似乎存在某种未记录的异常

资料来源:
Bug/Failsafe Discovery:

乍一看,里面没有任何东西会触发任何跨源检查。。。你确定这就是你所有的吗?错误从哪个页面触发?你们能试着精确地确定哪一条线触发它吗?如果使用通配符
“*”
作为postMessage的目标源,会怎么样?您是否在此浏览器中安装了任何插件?这是什么版本的Safari?@Kaido我将尝试在子网站上将源代码更改为通配符,我已经尝试在主网站上要求他们更改,但没有成功。根据错误,似乎是mainSite触发了错误。我不确定插件,我是一个windows用户,所以我没有经历过错误,直到我把它发送给另一个有mac的团队,我会问,但是有来自不同用户的多个报告,我认为他们没有相同的插件。很可能是最新版本,也不确定。@Kaido对此进行了更新,使用通配符并没有在safari中修复它,它仍然适用于所有浏览器。Safari版本是最新的,也发生在最新的iOS更新Safari上。不幸的是,我不再从事该项目。在我离开该项目时,唯一的解决方案是有一个回退选项,他们添加了一个常规登录表单,而不是与主站点共享令牌。仍然很好奇为什么会出现这种情况。也可能是一个简单的
控制台。日志(事件)
这个树屋代码笔是一个很好的工具。。。它在Safari上不起作用。似乎有一些要求,即父对象必须靠近子对象的域<代码>无法将消息发布到http://demos.mattwest.io. 收件人有来源https://cdpn.io.