查找以前由window.open打开的窗口

时间:2010-03-16 14:31:24

标签: javascript window.open

我们遇到以下情况:从单个域运行:

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

用户现在重新加载页面A.对命名窗口的引用将丢失。使用window.open()“找到”窗口会产生重新加载它的不幸副作用(不合需要)。有没有其他方法可以获得对此窗口的引用?

5 个答案:

答案 0 :(得分:24)

试试这个:

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为空白,因此不会重新加载窗口的内容。

答案 1 :(得分:1)

AFAIK,没有没有..

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


    setInterval(function() {
        if(window.opener) {
            window.opener.document.myPopupWindow = window
        }
    }, 100)

在父窗口中,即使重新加载(也就是重新加载后100毫秒),您也可以访问document.myPopupWindow。这应该跨浏览器。

答案 2 :(得分:0)

实际上你所做的是破坏所创建窗口(Popup)的父(页面A),因此它不再引用原始父级,因此你无法直接引用。

我能想到的唯一解决方案是使用一个浏览器,它提供了添加的javascript功能,可以在活动窗口(标签)中循环,找到一个具有特殊属性的浏览器(即:重新加载的页面A),弹出窗口可以识别

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

答案 3 :(得分:0)

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

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

updateOpener(); 

这是在父窗口的onload中。要确保myPopupWindow已设置等待100毫秒才能访问它。

setTimeout(function() {
    if (document.myPopupWindow) 
        document.myPopupWindow.focus();
}, 100);

答案 4 :(得分:0)

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

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