2013-09-26 46 views
10

window.open()从主线程调用默认情况下会打开新选项卡。来自回调的javascript window.open

但是,每一次(歌剧16和谷歌Chrome 29)这里在新窗口打开

<input type="button" value="Open" onclick="cb1()"> 

<script type="text/javascript"> 
function cb1() { 
    setTimeout(wo, 1000); //simple async 
} 

function wo() 
{ 
    var a = window.open("http://google.com", "w2"); 
    a.focus(); 
} 
</script> 

(笑,这是我Open a URL in a new tab (and not a new window) using JavaScript答案)。

我怎样才能打开标签(通过浏览器默认)在这里?

+0

这种行为发生在什么浏览器? – shanet

+0

希望这是你的_ [答案](http://stackoverflow.com/questions/2601761/change-browser-settings-by-script)_。所有浏览器均为 –

+0

。测试页<!DOCTYPE html> user2819018

回答

0

如果新窗口作为新选项卡或新实例打开取决于用户设置。

+0

OP表示,在某些情况下,它在新窗口中打开,在其他窗口中打开,因此他遇到的问题显然与用户设置无关。 – Yogh

10

我们遇到了同样的问题,并且围绕着SO寻找答案。我们发现在我们的情况下工作和蒸馏的智慧如下:

该问题与浏览器弹出窗口阻止程序有关,阻止编程窗口打开。浏览器允许从主线程上发生的实际用户点击打开窗口。同样,如果您在主线程上调用window.open,它将起作用,如上所述。根据Open a URL in a new tab (and not a new window) using JavaScript上的回答,如果您使用的是Ajax调用,并且想要成功打开该窗口,则需要设置async: false,因为这会将所有内容都保留在主线程中。

我们无法控制我们的Ajax调用,但发现了另一个解决方案,因为相同的原因。警告,这有点哈克,可能不适合你给你的限制。在Open a URL in a new tab (and not a new window) using JavaScript上提供不同答案的评论,您在致电setTimeout之前打开窗口,然后在延迟功能中更新它。有几种方法可以做到这一点。在打开它时保留对该窗口的引用,w = window.open...并设置w.location或者打开一个目标,window.open('', 'target_name'),在该目标中打开的延迟功能window.open('your-url', 'target_name'),并依靠浏览器保留引用。

当然,如果用户有他们的设置在新窗口中打开链接,这不会改变这一点,但这对OP来说不是问题。

+1

对于需要更详细代码的用户,请查看以下博客文章:http://theandystratton.com/2012/how-to-bypass-google-chromes-javascript-popup-blocker –