【问题标题】:Find window previously opened by window.open查找以前由 window.open 打开的窗口
【发布时间】:2010-03-16 14:31:23
【问题描述】:

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

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

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

【问题讨论】:

  • 哇,今天早上还有另一个问题几乎与此一模一样。
  • 你能把它贴在这里吗?我没找到。

标签: javascript window.open


【解决方案1】:

试试这个:

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

【讨论】:

  • 这看起来很棒。有机会我会试试的。
  • 我推荐使用 popupPlayer.location.href 而不是 popupPlayer.location。这避免了使用 === 而不是 == 时出现的问题(例如 CoffeeScript 会自动执行此操作)。
  • 如果弹出窗口的 URL 与当前窗口不在同一个域中,则可能会出现问题。将 IF 包装在 try/catch 中以避免出现问题。
【解决方案2】:

AFAIK,不,没有..

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

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

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

【讨论】:

  • 是的,我查过了。但是,当打开的窗口关闭时,上面的代码每秒会有 10 个空指针。已对其进行修改以检查 null :)
  • 找到窗口就不能停止间隔吗?!
  • Josh:不,那样的话它在多次重新加载父窗口后将无法工作。
【解决方案3】:

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

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

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

【讨论】:

  • 没有骰子。需要 x 浏览器。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多