【问题标题】:window.opener issue with window.open() when replacing a window替换窗口时,window.open() 的 window.opener 问题
【发布时间】:2012-10-12 08:40:32
【问题描述】:

我有一个 Web 应用程序,其中第 1 页使用打开一个弹出窗口

window.open(myUrl, "fixedApplicationTargetId", "");

然后第 2 页使用 相同的目标值调用 window.open 覆盖相同的弹出窗口

window.open(anotherUrl, "fixedApplicationTargetId", "");

此时页面#1最初创建的弹出窗口的内容显示了页面#2创建的新内容。到目前为止,任何浏览器都很好。

然后弹出窗口本身会检测谁最后打开弹出窗口并使用 window.opener 更新内容。在调用 window.open 第 1 页和第 2 页之前,创建一个全局变量 globalPageId 并分别分配一个唯一编号。弹出窗口检查 window.opener.globalPageId 的值,并检测上次更新弹出内容的窗口。

这是事情分崩离析的地方:上述内容适用于每次使用 window.open 更新内容时在弹出窗口中更新 window.opener 的 chrome 和 firefox。相反,IE 和 Opera 总是将弹出的 window.opener 指向第一个使用 window.open 的窗口。

任何建议,在多个页面在同一目标上调用 window.open 的情况下,如何从弹出窗口本身检测哪个窗口最后打开了该窗口?

【问题讨论】:

    标签: javascript window.opener


    【解决方案1】:

    window.opener 应该是可读写的(Internet Explorer 3 除外),因此您可以自己将其设置为适当的窗口。但是,有些浏览器会限制此操作,只允许将opener 设置为nullprevent security issues

    另一种解决方案是使用自定义属性而不是 opener。你可以手动设置:

    window.open(myUrl, "fixedApplicationTargetId", "").realOpener = window;
    

    然后在其余代码中使用window.realOpener.globalPageId 而不是window.opener.globalPageId

    【讨论】:

    • 也许到了那里...至少更近了...我尝试了(popupWin = window.open(myUrl, fixedTarget, options)).myOpener = window;,它在chrome中工作,但IE仍然无法正确分配myOpener。这应该是一个时间问题,它在 IE 中使用 popupWin = window.open(myUrl, fixedTarget, options)); setTimeout("popupWin.myOpener = window;", 1000); 有没有办法获得弹出窗口完成加载的通知,以便我执行正确的分配(显然我不能在弹出窗口中使用开启器因为这是开始的问题)?我不想依赖 setTimeout...
    • @Paolo,如果您不介意延迟,可以尝试处理弹出窗口的load 事件。但是,我不确定setTimeout() 是不是这里的问题,也许控制只需要离开当前功能。 setTimeout(function() { popupWin.myOpener = window; }, 4); 是否给出相同的结果?
    • 试图将超时时间降低到 10 毫秒,但它不再起作用。恐怕 setTimeout 是个问题。不知道处理弹出窗口的加载事件是什么意思......我显然不能从弹出窗口本身做到这一点,因为我无法访问开启器(我们首先讨论的问题),除非我从开瓶器开始定期超时以检查客户端的就绪状态...听起来很人为...
    • @Paolo,我的意思是处理来自开启窗口的弹出窗口的load 事件。类似于popupWin = window.open(myUrl, fixedTarget, options); popupWin.onload = function() { popupWin.myOpener = window; };
    • 感谢您的帮助...这不起作用。我想如果我无法访问弹出窗口来设置变量,那么我也无法访问它来设置 onload 事件......我可能会放弃这个并将其作为众多 IE 不兼容问题之一......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2015-05-22
    • 2017-03-28
    相关资源
    最近更新 更多