【问题标题】:How do I detect window opener in IE如何在 IE 中检测开窗器
【发布时间】:2013-09-08 13:56:38
【问题描述】:

我在堆栈上找不到任何好的答案 - 它们与对话框、文本编辑器有关,并且有人使用 VBScript。

我需要向开窗器发送消息。这在 FF、Chrome 和 Opera 中运行良好,但 window.opener 在 IE8-10 中为空。

我正在使用window.open 使新窗口出现。

我什至试过这个:

var new_window = window.open( url, '_social', "height=600,width=600" );

if ( !new_window.opener ) {
  new_window.opener = window;
}

打开的窗口只有一个这样的脚本标签:

<script type="text/javascript">
var data = {
  type : 'redirect',
  destination : '<?= $destination; ?>'
};
window.opener.postMessage( JSON.stringify( data ), '*' );
window.close();
</script>

我打开控制台并记录了window.opener,它显示为空,所以我认为这与 DOM 是否准备好无关。

在登陆带有脚本标签的页面之前,窗口会重定向几次。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    实际上,这个问题可能与 window.opener 无关——因为 IE8+ 只能使用 postMessage 与 iframe 通信。

    http://blogs.msdn.com/b/ieinternals/archive/2009/09/16/bugs-in-ie8-support-for-html5-postmessage-sessionstorage-and-localstorage.aspx

    【讨论】:

    • "不幸的是,这种解决方法通常是不可能的,因为同源策略规定弹出窗口和 window.opener 页面必须来自同一源才能调用彼此的脚本函数。”因此,由于我在不同的域中打开窗口,所以似乎没有打开器。
    • 好吧,是的,如果他们的 postMessage 实现只是对同源窗口访问的一种破解——看起来确实如此。值得注意的是,如果您尝试访问同一子域上的窗口,至少,您可以使用 document.domain 诡计来获取访问权限。
    • 我实际上有一个指向我自己域的 iframe,它打开了另一个域的窗口 - 但逻辑成立。如果我将window.open 用于我自己的域,opener 就在那里。长故事为什么会发生这种疯狂。
    【解决方案2】:

    IE8 不喜欢空格。删除它们以使其工作:

    var new_window = window.open(url,'_social',"height=600,width=600");
    
    if (!new_window.opener) {
      new_window.opener = window;
    }
    

    【讨论】:

    • 这在 IE9 或 10 中也不起作用。此外,我从来没有遇到过任何地方的参数之间的空格问题。
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多