在Opera中设置opener.location

时间:2010-12-16 13:43:59

标签: javascript security popup opera

我有http://parent.comhttp://parent.com:8888上打开一个弹出窗口(这正在开发中,生产中甚至可能在另一个域上(我控制))。在弹出结束之后,它将包含以下内容:

 <!-- this is on http://parent.com:8888/popup.php -->
 <html>
     <script type="text/javascript">
         window.opener.location.href = "http://parent.com/ow_yeah.php";
         self.close(); 
     </script>
 </html>

适用于除IE8和Opera之外的所有浏览器。在IE8中,我仍然需要调查,但Opera是让我烦恼的。它抛出的错误是:

Uncaught exception: ReferenceError: Security error: attempted to write protected variable

尝试this但是没有用。我还通过互联网阅读这是一个跨域问题:子窗口永远不应该修改它的父窗体上的某个东西另一个域EXECPT父窗口的位置。我尝试做的是改变位置,但我仍然有问题。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

同源政策在这里发挥作用。如果查看chart,您会看到不同的端口被视为不同的域。

答案 1 :(得分:0)

确实,这是因为不同的端口被视为不同的起源。我很惊讶您只在某些浏览器中看到它失败了,但我猜他们的安全策略可能会有所不同。你在任何地方设置document.domain,BTW?

如果由于某些原因确实需要使用来自不同来源的弹出窗口和父窗口进行此设置,则可能必须回退到使用window.postMessage()进行通信。看到 http://ejohn.org/blog/cross-window-messaging/(在其示例中有点过时但对原则的解释非常好)和 http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#web-messaging - 当前规范,带有可复制粘贴的示例代码。