从iFrame重定向父窗口在Safari中不起作用

时间:2019-07-07 17:53:40

标签: javascript iframe safari

我的网站是mysite.com。我正在iframing othersite.com上,并让我的用户在上面完成任务。

我可以通过API检查我的用户是否已在othersite.com上完成了任务。但是,我想找出另一种方法来弄清楚用户何时完成任务,以便可以导航到mysite.com的下一页。

当用户在othersite.com上完成任务时,othersite.com会将其重定向到iframe中的MyCallableSubclass。我通过将以下JS代码放在mysite.com/complete/

上来利用这一点

mysite.com/complete/

以便将父窗口自动推送到下一页。我已经在Chrome上运行此功能,但是在Safari上,它会重定向内部iframe,而不是父级。

是什么原因导致Chrome和Safari之间出现差异?有没有更好的方法可以实现这个目标?

注意:我已经看过这个this answer,所以Safari中的window.top.location == 'mysite.com/next';函数似乎正在发生某些事情,但是即使尝试该修复,我也很难逃脱内部iframe的作用。 / p>

1 个答案:

答案 0 :(得分:0)

31

您只是不能这样做。大多数浏览器不允许跨站点脚本编写。

但是,您可以通过此处描述的跨文档消息传递与另一个窗口进行通信:https://developer.mozilla.org/en/DOM/window.postMessage

最能做的是将消息从弹出窗口发送到打开器,并在打开器中侦听此类消息。然后,打开器必须自行更改其位置。

父窗口:

<script language="javascript">

function open_a_window() 
{
    var w = 200;
        var h = 200;
        var left = Number((screen.width/2)-(w/2));
        var tops = Number((screen.height/2)-(h/2));

        window.open("window_to_close.html", '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+tops+', left='+left);

   return false;
}

// opener:
window.onmessage = function (e) {
  if (e.data === 'location') {
    window.location.replace('https://www.google.com');
  }
};

</script>

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

弹出窗口:

<!DOCTYPE html>
<html>
<body onload="quitBox('quit');">

<h1>The window closer:</h1>

<input type="button" onclick="return quitBox('quit');" value="Close This Window/Tab" /> 


<script language="javascript">

function quitBox(cmd) 
{      
    if (cmd=='quit')    
    {   
       window.opener.postMessage('location', '*');
       window.open(location, '_self').close();    
    }     
    return false;   
}

</script>

</body>
</html>