JavaScript - 参考浏览器窗口的名称?

时间:2012-02-20 16:40:57

标签: javascript

当您创建新的浏览器窗口时,您将传递一个如下名称:

myWindow = window.open('http://www.google.com', "googleWindow");

稍后您可以从保存它的变量中访问该窗口:

myWindow.close();

是否可以通过名称(googleWindow)而不是变量来访问和操作窗口?

如果不可能,那么给出Windows名称的重点是什么?

5 个答案:

答案 0 :(得分:18)

没有。如果没有对窗口的引用,则无法通过名称或其他方式再次找到它。没有窗户的集合。

更新:以下是您自己可以做到的方法:

var windows = {};
function openWindow(url, name, features) {
    windows[name] = window.open(url, name, features);
    return windows[name];
}

现在,openWindow将始终打开窗口,如果窗口已经存在,它将在该窗口中加载给定的URL并返回对该窗口的引用。现在您还可以实现findWindow

function findWindow(name) {
    return windows[name];
}

如果窗口存在,将返回窗口,或undefined

您还应该拥有closeWindow,因此您不会保留对您自己打开的窗口的引用:

function closeWindow(name) {
    var window = windows[name];
    if(window) {
        window.close();
        delete windows[name];
    }
}
  

如果不可能,那么给出Windows名称的重点是什么?

浏览器在内部使用该名称来管理窗口。如果您使用相同名称调用window.open,则不会打开新窗口,而是将URL加载到先前打开的窗口中。还有一些内容来自MDN window.open()

  

如果已存在名为strWindowName的窗口,则strUrl将加载到现有窗口中。在这种情况下,方法的返回值是现有窗口,并忽略strWindowFeatures。为strUrl提供空字符串是一种通过名称获取对打开窗口的引用而不更改窗口位置的方法。要在每次调用window.open()时打开一个新窗口,请为strWindowName使用特殊值_blank。

答案 1 :(得分:14)

Linus G Thiel说你不能在javascript中这样做。奇怪的是,他的答案列出了MDN的一段摘录,听起来它告诉了如何做到这一点。这条线是:

 "Providing an empty string for strUrl is a way to get a reference to
  an open window by its name without changing the window's location."

我尝试了这个,它对我有用。

 winref = window.open('', 'thatname', '', true);
 winref.close();

但是,这可能仅在您从页面打开窗口时才有效。如果这是真的,那么做一个窗口是没有意义的。打开只是为了得到参考。在这种情况下,您可能已经有了参考。

答案 2 :(得分:3)

Mark Goldfain的解决方案不再像2015年9月8日那样起作用

根据this w3 specification

  

如果第一个参数是空字符串,那么url参数必须   被解释为" about:blank"。

我认为这是HTML4和HTML5之间的区别。

IE和Chrome已更新此行为以符合此规范,而Mark的解决方案仍适用于FF(尽管我想他们很快会解决此问题)。几个星期前,这适用于所有主流浏览器。

我的特殊问题涉及导航时的窗口控制,其中聊天窗口打开是黑盒子以及页面上的大部分代码 - 重新定义window.open是正确的。我的解决方案涉及在调用调用聊天窗口的函数之前使用引用调用空白窗口。当用户离开页面时,我能够依赖于原始父级以外的窗口不允许修改子窗口的事实,因此我能够使用Mark Goldfain的解决方案不变。 / p>

答案 3 :(得分:3)

可以编辑Mark Goldfain提供的解决方案以使用新浏览器,至少打开一个窗口并在页面刷新之间保持对它的引用。

var winref = window.open('', 'MyWindowName', '', true);
if(winref.location.href === 'about:blank'){
    winref.location.href = 'http://example.com';
}

或以函数格式

function openOnce(url, target){
    // open a blank "target" window
    // or get the reference to the existing "target" window
    var winref = window.open('', target, '', true);

    // if the "target" window was just opened, change its url
    if(winref.location.href === 'about:blank'){
        winref.location.href = url;
    }
    return winref;
}
openOnce('http://example.com', 'MyWindowName');

答案 4 :(得分:0)

我最终使用了以下内容:

var newwindows = {};
function popitup(url, nm) {
  if ((newwindows[nm] == null) || (newwindows[nm].closed)) {
    newwindows[nm] = window.open(url, nm, 'width=1200,height=650,scrollbars=yes,resizable=yes');
  }
  newwindows[nm].focus();
}

然后使用:

引用
     <button type="button" onclick="popitup('url/link.aspx?a=bc',this.value)" value="uniqueName">New</button>