JavaScript-按名称引用浏览器窗口?

JavaScript-按名称引用浏览器窗口?,javascript,Javascript,创建新的浏览器窗口时,会向其传递如下名称: myWindow = window.open('http://www.google.com', "googleWindow"); 稍后,您可以从保存为的变量访问该窗口: myWindow.close(); 是否可以通过名称(googleWindow)而不是变量来访问和操作窗口 如果不可能,给窗口命名有什么意义?否。如果没有对窗口的引用,您将无法通过名称或其他方式再次找到它。没有窗口集合 更新:以下是您可以自己完成的方法: var windows =

创建新的浏览器窗口时,会向其传递如下名称:

myWindow = window.open('http://www.google.com', "googleWindow");
稍后,您可以从保存为的变量访问该窗口:

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


如果不可能,给窗口命名有什么意义?

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

更新:以下是您可以自己完成的方法:

var windows = {};
function openWindow(url, name, features) {
    windows[name] = window.open(url, name, features);
    return windows[name];
}
function closeWindow(name) {
    var window = windows[name];
    if(window) {
        window.close();
        delete windows[name];
    }
}
现在,
openWindow
将始终打开该窗口,如果该窗口已经存在,它将在该窗口中加载给定的URL并返回对该窗口的引用。现在您还可以实现
findWindow

function findWindow(name) {
    return windows[name];
}
如果窗口存在,将返回该窗口,或者
未定义

您还应该有
关闭窗口
,这样您就不会保留对自己打开的窗口的引用:

var windows = {};
function openWindow(url, name, features) {
    windows[name] = window.open(url, name, features);
    return windows[name];
}
function closeWindow(name) {
    var window = windows[name];
    if(window) {
        window.close();
        delete windows[name];
    }
}
如果不可能,给windows命名有什么意义

浏览器在内部使用该名称来管理窗口。如果使用相同的名称调用
window.open
,它不会打开新窗口,而是将URL加载到以前打开的窗口中。还有几件事,来自:

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


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

但是,这可能仅在从页面打开窗口时有效。如果这是真的,那么做一个window.open只是为了获取引用是毫无意义的。在这种情况下,您可能已经有了参考资料。

自2015年9月8日起,Mark Goldfain的解决方案不再有效

根据,

如果第一个参数是空字符串,则url参数必须为空 被解释为“关于:空白”

我相信这是HTML4和HTML5之间的区别

IE和Chrome已经更新了这个行为以符合这个规范,而Mark的解决方案仍然在FF上工作(尽管我想他们很快就会解决这个问题)。几周前,这在所有主流浏览器上都有效

我的特殊问题涉及到导航时的窗口控制,其中聊天窗口的打开是黑框的,页面上的大部分代码也是黑框的——重新定义window.open是正确的。我的解决方案是在调用调用聊天窗口的函数之前,用引用调用空白窗口。当用户离开该页面时,我可以依赖这样一个事实,即不允许原始父窗口以外的窗口修改子窗口,因此我可以使用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');

我最终使用了以下方法:

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>
新建

很好的解释和解决方法。谢谢这可能适用于windows,但在我的linux系统上不起作用…不确定它是否是Microsoft windows引用,但有时在我的linux机器上发生的事情也会发生在Mac上…从Google Chrome 41开始,这种方法有一个坏的副作用:无论何时执行window.open(),已经打开的窗口都会有焦点。目前我找不到任何解决办法来防止这种行为,这让我头疼。我只想引用那个窗口,我不想它得到焦点。使用空url调用window.open()不起作用。它实际上不是基于谁打开了它,而是基于页面共享的源或域。您可以使用
winref.document.close()清除内容winref.document.write('newcontent')添加新内容为什么不简化逻辑并放置
newwindows[nm].focus()完全在if逻辑之外?在两个不同的逻辑路径中执行相同的操作似乎是多余的,而结果是两种方式中的相同操作。