24

我们有以下情况,从单个域运行:

页面 A 用于window.open()打开命名窗口(弹出播放器)。window.open()为页面 A 提供对窗口的引用。

用户现在重新加载页面 A。对命名窗口的引用丢失。使用window.open()“查找”窗口具有重新加载它的不幸副作用(不受欢迎)。有没有其他方法可以参考这个窗口?

4

5 回答 5

26

试试这个:

var playerUrl = 'http://my.player...';
var popupPlayer= window.open('', 'popupPlayer', 'width=150,height=100') ;
if(popupPlayer.location.href == 'about:blank' ){
    popupPlayer.location = playerUrl ;
}
popupPlayer.focus();

它将打开一个具有唯一名称的空白窗口。由于 url 为空白,因此不会重新加载窗口的内容。

于 2010-03-16T15:06:35.993 回答
1

AFAIK,不,没有..

一种肮脏但我猜它会起作用的技巧是使用 window.opener 从弹出窗口中定期重置父窗口上的引用,代码如下:

    设置间隔(函数(){
        如果(window.opener){
            window.opener.document.myPopupWindow = 窗口
        }
    }, 100)

在父窗口中,您将能够访问 document.myPopupWindow,即使在重新加载之后(嗯,重新加载后 100 毫秒)。这应该跨浏览器工作。

于 2010-03-16T14:46:05.287 回答
0

实际上,您所做的是销毁创建的窗口(弹出窗口)的父级(页面 A),因此它不再引用原始父级,因此您无法获得直接引用。

我能想到的唯一解决方案是使用一种浏览器,该浏览器为您提供添加的 javascript 功能来循环浏览活动窗口(选项卡)并找到一个具有特殊属性的浏览器(即:您重新加载的页面 A),该属性可以被弹出窗口识别。

不幸的是,我猜只有 Firefox 有一些额外的功能或扩展,可以为您提供这种灵活性。(虽然这也是一个安全风险)

于 2010-03-16T14:39:12.857 回答
0

这应该有效。在弹出窗口中添加此代码:

function updateOpener() {
    if (window.opener)
        window.opener.document.myPopupWindow = window;
    else
        setTimeout(updateOpener, 100);
}

updateOpener(); 

这在父窗口的加载中。要确保 myPopupWindow 已设置,请等待 100 毫秒后再访问它。

setTimeout(function() {
    if (document.myPopupWindow) 
        document.myPopupWindow.focus();
}, 100);
于 2010-10-22T09:12:55.950 回答
0

如果所有窗口共享一个共同的 Url 来源,您可以注册一个 ServiceWorker,然后从 ServiceWorker 访问所有窗口:https ://developer.mozilla.org/en-US/docs/Web/API/Clients

AFAIK 您将无法将 WorkerService 对其他窗口的引用传递到您的窗口,但您可以通过以下方式与 ServiceWorker 建立通信

于 2019-11-06T12:42:29.453 回答