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逻辑之外?在两个不同的逻辑路径中执行相同的操作似乎是多余的,而结果是两种方式中的相同操作。