Javascript:如何确保window.open返回相同的窗口(如果已经打开)

时间:2016-01-04 07:38:44

标签: javascript

我正在开发一个基于Web的应用程序,我必须在其中打开弹出窗口。我使用gl_ObjectPlaneR[gl_MaxTextureCoords]方法打开弹出窗口,如下所示:

gl_ObjectPlaneQ[gl_MaxTextureCoords]

其中url包含我希望弹出窗口导航到的URL。现在,问题是,如果我从多个标签(具有相同或不同的网址)执行window.open(),至少在Chrome上,它可能/可能不会为您提供之前打开的相同窗口。这个行为是不一致的,我的意思是,它应该每次都给我一个新的窗口,或者它应该让我每次都打开窗口。

我需要为整个域保留相同的弹出窗口。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

好像有一个方向可以去或者至少试一试。

它完全保留在localStorage上,这使您能够在单个域中的选项卡之间共享知识。

我在下面提供的代码(它只是一个方向),所以不要期望太多运行它。

它的作用:它通过localStorage中的网址保存弹出窗口,当您尝试使用相同的网址打开新网址时,它不会这样做。如果您不想通过URL区分它们,则更简单:将boolean存储在localStorage而不是对象中。

它不会做但应该:

  1. 它应该听取弹出onunload(关闭)事件并相应地重置localStorage信息。这里最适合您将localStorage boolean值设置为false
  2. 它应该监听当前标签onunload(重新加载,关闭)事件,并根据您的逻辑重置某些内容。据我所知,最适合你的只是检查这个标签是否是你域中的最后一个(你也可以使用localStorage,例如在每个新标签上添加标识符,例如创建时间戳并在标签关闭时销毁它)和如果将localStorage boolean值设置为false
  3. 我认为,这足以解决问题。最后是一小段代码:

    // get the localstorage url map
    function getOpenPopups() {
      var obj = localStorage.getItem('mypopups');
    
      return obj ? JSON.parse(obj) : {};
    }
    
    // set the localstorage url map
    function setOpenPopups(object) {
      localStorage.setItem('mypopups', JSON.stringify(object))
    }
    
    // open the popup
    function popup(url, title) {
      var popups = getOpenPopups();
    
      // check whether popup with this url is already open
      // if not then set it and open the popup
      if (!popups[url]) {
        popups[url] = true;
    
            setOpenPopups(popups);
    
        return window.open('abc', 'cde');
      }
      else {
        return false;
      }
    }
    

    jsFiddle

答案 1 :(得分:0)

w3c documentation我们可以看到window.open()返回对新创建的窗口的引用,如果调用失败则返回null。这意味着我们可以将其保留在内存中并检查该窗口的closed标志。

var newWindow = window.open('/some/path', 'TestWindow');
// ...
if (!newWindow.closed) {

}

请记住,如果存在具有以下名称的窗口,则页面将在同一窗口中加载而不打开新窗口。 您可以在官方文档中找到{_ 1}}参数的其他变体,如_blank,_self,_top,_parent。