在瀏覽器的安全機制里,非用戶觸發的window.open方法是會被攔截的,例如:
var btn = $('#btn'); btn.click(function () { // 算做用戶觸發,所以不會被攔截
window.open('http://cssha.com') });
上面的window.open是用戶click觸發的,所以不會被攔截,可以正常打開新窗口。再看下面這個:
var btn = $('#btn'); btn.click(function () { $.ajax({ url: '...', success: function (url) { // 會被攔截
window.open(url); } }) });
用戶沒有直接觸發window.open,而是發出一個ajax請求,window.open方法被放在了ajax的回調函數里,這樣的情況是會被攔截的,因為瀏覽器認定不是為用戶所觸發。
那么當用戶點擊按鈕,發出ajax請求,如何在ajax請求完成后再打開新窗口,又不被攔截呢? 接着往下看:
var btn = $('#btn'); btn.click(function () { // 先打開一個不被攔截的新窗口
var newWindow = window.open(); $.ajax({ url: '...', success: function (url) { // 然后修改新窗口的url
newWindow.location.href = url; } }) });
當用戶點擊按鈕的時候,先打開一個空白頁,這時不會被攔截,然后再發ajax請求,在ajax回調里面修改新窗口的 location.href,這樣就不會被攔截了。