2013-09-26 43 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 –