Javascript 查找以前由window打开的窗口。打开

Javascript 查找以前由window打开的窗口。打开,javascript,window.open,Javascript,Window.open,我们从单个域运行时遇到以下情况: 页面A使用window.open()打开命名窗口(弹出式播放器)window.open()为页面提供对该窗口的引用 用户现在重新加载页面A。对命名窗口的引用丢失。使用window.open()来“查找”窗口有一个不幸的副作用,那就是重新加载它(不可取)。是否有其他方法获取此窗口的引用?实际上,您所做的是销毁所创建窗口(弹出窗口)的父级(a页),因此它不再引用原始父级,因此无法获取直接引用 我能想到的唯一解决方案是使用一个浏览器,该浏览器为您提供了额外的javas

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

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


用户现在重新加载页面A。对命名窗口的引用丢失。使用
window.open()
来“查找”窗口有一个不幸的副作用,那就是重新加载它(不可取)。是否有其他方法获取此窗口的引用?

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

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


不幸的是,我想只有firefox有一些额外的功能或扩展,给了你这种灵活性。(这也是一种安全风险)

好吧,不,没有

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

setInterval(function() { if(window.opener) { window.opener.document.myPopupWindow = window } }, 100) setInterval(函数(){ if(窗口开启器){ window.opener.document.myPopupWindow=窗口 } }, 100) 在父窗口中,您将能够访问document.myPopupWindow,即使在重新加载之后(嗯,重新加载100毫秒之后)。这应该可以跨浏览器使用。

尝试以下操作:

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

这应该行得通。在弹出窗口中添加此代码:

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);

如果所有窗口共享一个公共Url源,则可以注册ServiceWorker,然后从ServiceWorker访问所有窗口:

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


哇,今天早上还有一个类似的问题,你能在这里发布吗?我找不到,没有骰子。需要是x浏览器。是的,我查过了。但是,当打开的窗口关闭时,使用上面的代码每秒将有10个空指针。已将其修改为检查null:)一旦找到窗口,您就不能停止间隔吗?!乔希:不,那样的话,在多次重新加载父窗口后,它就不起作用了。这看起来很棒。如果有机会,我将尝试。我建议使用popuplyer.location.href代替popuplyer.location。这可以避免在使用===而不是==(例如,CoffeeScript会自动执行此操作)时出现问题。如果弹出窗口的URL与当前窗口不在同一域中,则可能会出现问题。将IF包装为try/catch以避免出现问题。