2016-01-04 23 views
4

我正在开发一个基于Web的应用程序,其中我必须打开弹出窗口。我使用window.open()方法来打开弹出,就像这样:Javascript:如何确保window.open返回相同的窗口(如果已经打开)

window.open(url, "popupWin"); 

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

我需要坚持相同的弹出窗口为整个域

任何人都可以请帮我解决这个问题吗?

+1

你不能。只能从打开它的标签页访问弹出窗口。 – Cerbrus

+1

你确定吗?我认为它可以从同一个来源访问。我猜想不一致取决于窗口的内容。如果内容与打开它的脚本的起源相同,并且与尝试访问它的NEXT脚本的起源相同,则它应该保留。否则,将打开一个新窗口。检查控制台的访问是否被拒绝 – mplungjan

+1

如果弹出窗口对象引用不会出现在另一个选项卡上,它如何从同一来源访问? – smnbbrv

回答

0

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

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

} 

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

+0

Hello @ oleg-meleshko,有什么方法可以与多个/不同的标签分享吗?或者,让它在重定向中生存下来? –

+0

您可以在任何打开的窗口中使用'window.name'来获取当前的窗口名称。有了这些,你可以使用一些单一的服务器/客户端存储来保存关于特定窗口状态的信息。 –

2

看起来好像有一个方向去或至少尝试一下。

它完全保留在localStorage,它使您能够在单个域内的标签之间共享知识。

我给出的代码不起作用(这只是一个方向),所以不要期望太多的运行它,因为它是。

它做了什么:它通过url保存弹出窗口localStorage,当您尝试使用相同的URL打开一个新窗口时,它不会这样做。如果您不想通过URL区分它们,则更简单:在localStorage中存储布尔值而不是对象。

它不会做什么,但应该:

  1. 应该听弹出onunload(关闭)事件,并相应地重置localStorage信息。最适合你这里只是你localStorageboolean值设置为false
  2. 应该听取当前选项卡onunload(重装,关闭)事件,并按照你的逻辑重新设置的东西。据我所知,最好的办法就是检查这个标签是否是你域中的最后一个(你也可以使用localStorage来做到这一点,例如在每个新标签上添加它的标识符,例如创建时间戳并在标签关闭时销毁它)和如果它将localStorageboolean的值设置为false

这个我认为就足以解决问题。最后一小块代码:

// 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

+0

嗨@smnbbrv,谢谢你的回答。实际上,当我调用'popup'函数时,我真正想做的就是引用弹出窗口,如下所示:https://jsfiddle.net/PrakharMishra/gp5k3evx/1/。 –

+1

@PrakharMishra恐怕建议的方式是你能做的唯一方法。您不会因为它属于另一个选项卡/窗口/线程而获得对该弹出框的引用。您也无法在localStorage中存储参考。您仍然可以通过任何选项卡与弹出窗口进行通信:只需在localStorage中推送通知,并在另一端以超时循环/间隔读取它们即可。我知道,这不是最简单的方法,但我不确定你可以选择其他任何东西 – smnbbrv

相关问题