Chrome浏览器中新建标签页或窗口的window.open行为

8

我有一小段javascript代码,旨在打开两个或更多选项卡。在Firefox和IE中运行良好,但是Chrome会将第二个选项卡打开为新窗口而不是选项卡。它不依赖于URL,因为我已经尝试了两个相同的URL。第一个在选项卡中打开,第二个在新窗口中打开。

这是我的代码片段:

for(var i=0 ; i<sites.length ;i++)
{
    window.open(sites[i].Url);
}

你能再清楚一些吗?我不明白你的问题。 - Niccolò Campolungo
@LightStyle 他的代码在Chrome中打开新窗口而不是新标签页。 - Juan Pablo Rinaldi
这里有一个测试页面,以便更容易理解:http://www.bosmaadvies.com/chrometest.html - user1151653
把以下与编程有关的内容从英语翻译成中文。仅返回已翻译的文本:(确保在该网站上允许弹出窗口) - user1151653
2个回答

12

如果是用户生成的操作,Chrome只会自动在一个新标签页中打开URL,并限制每个用户操作只能打开一个新标签页。在其他情况下,该URL将在一个新窗口中打开(顺便说一句,这在Chrome上默认被阻止)。

window.open必须在由用户操作(例如onclick)触发的回调函数中调用,才能使页面在新标签页中而不是新窗口中打开。

在您的示例中,您尝试在用户操作时打开N个标签页。但是,只有第一个标签页会在新标签页中打开(因为它是用户生成的操作)。此后,任何其他URL都将在一个新窗口中打开。

类似问题:force window.open() to create new tab in chrome(请参见maclema的答案)。


1
谢谢,我担心会是这样的情况。我已经将其报告给谷歌作为一个错误,因为我认为一个函数应该表现一致,而不是在第二次调用时改变行为。此外,其他浏览器只是打开标签页。 - user1151653
1
我认为这是设计上的问题,因为新窗口有一个阻止机制而新标签页没有。 这与警报的情况相同。 如果您有几个连续的警报(在相同的范围/上下文中)-第一个将正常显示,所有后续的警报都将有一个“防止进一步对话框”的复选框。 - Bagelzone Ha'bonè
1
我理解这些考虑因素,但坦白地说,如果它导致意外行为,那么我认为这是一个愚蠢的设计。我喜欢知道对函数的调用会做什么,如果一次 window.open 的调用与另一次完全不同的结果,则该设计存在错误。此外,FF 和 IE 都有弹出窗口拦截器并正确实现了此功能。 - user1151653

0
我遇到了这个问题JavaScript中的(function() { } )()构造是什么?,它解释了IIFE。我认为这可以用在...上。请原谅我对JavaScript没有深入的了解。但我尝试了下面的代码,它可以工作。
var sites = [{"url" : "http://www.google.com"} , {"url" : "http://www.yahoo.com"} , {"url" : "http://www.msn.com"}];
console.log(sites);
for( var i=0 ; i < sites.length ;i++) {
    (function(i) {
        console.log(i);
        window.open(sites[i].url , "_blank");
    })(i);
}   

它可以在Chrome浏览器中打开新标签页的URL。


在Chrome版本49.0.2623.112中无法工作(至少不作为书签工具):Google会打开,但Yahoo会被阻止。 - Florian Straub
我在Chrome版本65.0.3325.181(官方版本)(64位)上尝试了一下,它可以工作。您必须启用默认情况下被阻止的弹出窗口。例如,在index.html中,如果您已经包含了所需的代码,则需要在Chrome中打开index.html时启用弹出窗口。 - Ganesh G
启用弹出窗口后,您需要重新加载页面。 - Ganesh G
感谢您的研究。同时,我将我的书签减少到只收集链接并将它们写入文本区域。然后我将它们复制到Chrome扩展程序“批量URL打开器”中,该扩展程序会为我完成其余工作。如果这个解决方案有一天让我感到烦恼,我会再试一次。 - Florian Straub

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