如何在JavaScript中打开新的窗口而非标签页?

404

我有一个选择框,当选中某个项目时调用 window.open(url)。火狐浏览器默认会在新标签页中打开该页面。但是,我希望该页面在新的窗口中打开,而不是在新标签页中。

如何实现这一点?


3
请输入需要翻译的英文文本。 - Michael Freidgeim
1
可能是使用JavaScript在新标签页中打开URL的重复问题。 - user456814
你可以使用 https://github.com/reduardo7/xpopup。 - Eduardo Cuomo
15个回答

507

5
好的提示。我认为Opera仍会在选项卡中打开这个链接 :)。 - Kevin Tighe
9
在IE6、FF 3.6和Chrome 9.0中工作。 - James Westgate
3
在 Firefox 11.0 版本中无法使用了,请参考我的问题! @James - Tomas
20
不适用于当今的浏览器。它们默认会在当前窗口的新标签页中打开一个新窗口。这也取决于浏览器选项。您无法使用JavaScript进行控制。 - Pavel Hodek
4
这并不是你在代码中加入“height=200,width=200”会在新窗口打开的事实。这只是添加额外参数(比如位置、状态等等,不重要)的事实。请注意保持原意,使语言更为通俗易懂。 - Peter
显示剩余15条评论

127
你不需要使用 height 属性,只需确保使用 _blank,否则它会在新标签页中打开。
对于一个空白窗口:
window.open('', '_blank', 'toolbar=0,location=0,menubar=0');

对于特定的URL:

window.open('http://www.google.com', '_blank', 'toolbar=0,location=0,menubar=0');

4
如果我也想给它起个名字怎么办? - Aditi
1
至少在Chrome中,当JS从按钮或锚元素调用时,需要使用location=0 - Ohad Schneider
1
完美地工作了。在火狐浏览器中还需要包含 location=0。 - Rick james
@nwbrad,你确定'_blank'部分吗?据我所知,当我们不指定任何其他值时,'_blank'是默认值。在你的情况下,打开一个新窗口而不是一个新标签与提供window.open函数的第三个参数有关。在你的情况下,它是'toolbar=0,location=0,menubar=0'。你可以通过省略这个第三个参数并将'_blank'作为第二个参数留在那里来验证它。 - user1451111
1
在现代浏览器中,如Firefox 76和Internet Explorer 11中完美运行。提示是在参数中添加location=0。我还建议命名窗口而不是使用_blank目标,这样如果用户多次单击打开弹出窗口的元素,则再次使用同一窗口,并且与focus()链接,以便已经打开的弹出窗口获得焦点:window.open('http://stackoverflow.com', 'Stack_Overflow','location=0').focus(); - OuzoPower

89

我可能会错,但据我所知,这由用户的浏览器偏好设置控制,我不认为可以覆盖这些设置。


50
我告诉过你,我有可用的代码。我在Firebug控制台输入了以下内容:window.open("", "poop", "height=200,width=200,modal=yes,alwaysRaised=yes");你猜怎么着???它能正常工作!!!! - theman_on_vista
25
是的,它能用,但这似乎有点像一个技巧。Firefox的编写方式使得打开新窗口和选项卡是浏览器偏好设置,而不是Javascript偏好设置。因此,在Firefox的后续版本中,您的建议可能无法正常工作。我宁愿不要依赖于技巧。 - adam
2
要明确的是,我并不是说这是一个JavaScript黑客技巧。添加窗口高度和宽度显然是js window.open方法的特性(http://www.w3schools.com/HTMLDOM/met_win_open.asp)。我的意思是,在操纵Firefox的预期行为方面存在黑客攻击的意义。 - adam
2
我不会真的称它为黑客攻击。你只是在妥协你实际想要的行为,并实现它。 - Matchu
1
从FF5开始,即使您在站点配置中有例外,此页面上的黑客也不起作用。 在Chrome 12中工作,但在FF中不起作用。 - boatcoder
显示剩余9条评论

17

尝试:

window.open("", [window name], "height=XXX,width=XXX,modal=yes,alwaysRaised=yes");

我有一些代码可以做你说的事情,但其中有很多参数。我认为这些是最基本的,如果不行,请告诉我,我会发布其余部分。


这在FF 31和Chrome 36中仅使用"modal=yes"选项工作。所有指定的选项也有效。我还在我的FF首选项中勾选了“在新标签页中打开新窗口”选项。如果没有打开选项,窗口会在新标签页中打开。 - Clint Pachl
经过更多测试,似乎几乎任何参数(只要至少有一个)都会打开一个新窗口而不是选项卡。例如,即使在FF 31和Chrome 36中,仅使用“top = 0”也可以工作。这是在使用cwm窗口管理器的OpenBSD上进行的测试。因此,结果可能会有所不同。 - Clint Pachl
我可以知道,什么是[窗口名称]? - pcs

12

好的,在进行了许多测试后,这是我的结论:

当您执行:

     window.open('www.yourdomain.tld','_blank');
     window.open('www.yourdomain.tld','myWindow');
无论你在目标字段中放入什么内容,都不会改变任何内容:新页面将在新选项卡中打开(因此取决于用户偏好)。
如果您希望页面在新的"真实"窗口中打开,您必须添加额外的参数。例如:
window.open('www.yourdomain.tld', 'mywindow','location=1,status=1,scrollbars=1, resizable=1, directories=1, toolbar=1, titlebar=1');

经过测试,似乎你使用的额外参数并不重要:不是你使用“这个参数”或“那个参数”会创建新的“真实窗口”,而是有新的参数。

但有些地方可能会让人困惑,这可能解释了很多错误的答案:

这个:

 win1 = window.open('myurl1', 'ID_WIN');
 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');

还有这个:

 win2 = window.open('myurl2', 'ID_WIN', 'location=1,status=1,scrollbars=1');
 win1 = window.open('myurl1', 'ID_WIN');

不会产生相同的结果。

在第一种情况下,当您首次打开一个没有额外参数的页面时,它将在一个新的标签页中打开。在这种情况下,由于您所指定的名称,第二个调用也将在这个标签页中打开。

在第二种情况下,由于您的第一个调用是带有额外参数的,因此该页面将在一个新的“真实窗口”中打开。在这种情况下,即使第二个调用没有额外参数,它也将在这个新的“真实窗口”中打开...但是在同一个标签页中!

这意味着第一个调用很重要,因为它决定了页面放置的位置。


这个答案应该有很多++++。 - Mitch VanDuyn

9
您可以尝试以下函数:

可能会用到以下代码:

<script type="text/javascript">
function open(url)
{
  var popup = window.open(url, "_blank", "width=200, height=200") ;
  popup.location = URL;
}
</script>

执行的HTML代码:

执行的HTML代码:

<a href="#" onclick="open('http://www.google.com')">google search</a>

3
popup.location = URL; 的目的是什么?window.open()调用应该将其打开到正确的URL,在您的代码示例中,URL未定义,因此它将退回到实验性(并不被广泛支持)的URL对象。 虽然在这里使用它是有争议的,但我很好奇它的使用动机是什么? - ken
很好的答案,教会了我如何使位置不可编辑。谢谢。 - VirtualProdigy

7

你不需要这样做。应该允许用户拥有他们想要的任何偏好。

Firefox默认这样做,因为在新窗口打开页面很烦人,如果用户不希望这样做,页面就不应该被允许这样做。(如果你设置了这种方式,Firefox允许你在新窗口中打开标签页)。


32
你错了。顺便说一句,说“你不应该需要”是不恰当的,特别是如果这是老板想要的事情。 - theman_on_vista
9
让我们尽量保持评论实用和有益,可以不同意但不要侮辱他人。 - adam
17
@theman_on_vista:说服你的老板是的责任。你的公司赋予了你解决设计问题的责任,包括指出错误的设计想法。 - EFraim
2
非常正确。屏幕属于用户,而不是其他任何人。 - Christopher Creutzig
13
设计者有权选择弹出窗口或选项卡。虽然我作为用户总是喜欢选项卡,但我认识到有时候,设计确实需要弹出窗口或选项卡。程序员应该有能力实现这一点。抛开哲学分歧,这种评论在编程参考网站上显然不合适。而且在这种情况下,问题不是“我该这样做吗?”,而是“我该如何实现?” - jbenet
显示剩余3条评论

6

我刚刚在IE (11) 和 Chrome (54.0.2794.1 canary SyzyASan) 测试了这个:

window.open(url, "_blank", "x=y")

... 并且它在新窗口中打开。

这意味着Clint pachl说得对,只要提供任何一个参数就会导致新窗口打开。

- 而且显然它不必是合法的参数!

(YMMV-就像我说的那样,我只在两个地方测试过......下一次升级可能会使结果无效,无论如何)

预计时间:我刚刚注意到,在IE中,窗口没有装饰。


window.open(url, windowName,"args"); 在 Safari 中无法正常工作。 - tatactic

6

关键在于参数:

如果您提供参数[高度 =“”,宽度=“”],则会在新窗口中打开。

如果您不提供参数,则会在新标签中打开。

已在Chrome和Firefox中进行测试。


1
newwin = window.open('test.aspx', '', ''); 在Chrome中测试过:26 - MoniR

6
对我来说,解决方案是拥有
"location=0"

在第三个参数中。已经在最新的FF / Chrome和旧版本的IE11上进行了测试

我使用的完整方法调用如下(因为我喜欢使用可变宽度):

window.open(url, "window" + id, 'toolbar=0,location=0,scrollbars=1,statusbar=1,menubar=0,resizable=1,width=' + width + ',height=800,left=100,top=50');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接