ajax回撥中使用window.open彈窗被chrome攔截的問題

張大晴發表於2018-05-07

文章轉自:https://segmentfault.com/q/1010000006760018

具體解決方法:

這種情況出現是由於window.open的執行時機,你的window.open是在ajax回撥中執行,無論是同步還是一步,等待ajax返回結果需要一定的時間,當你得到結果再去執行window.open,chrome認為這是一種不友好的行為(非使用者主動點選開啟彈窗),所以會被遮蔽。
碰巧在之前的專案中也遇到過,試了各種方法,最後發現沒有什麼特別完美的方法可以繞開這個限制,使用了一個方法:使用者點選時立馬開啟一個空白頁,然後等ajax回來的結果,拿到連結地址,替換掉之前空白頁的url。

$('#a').on('click', function(e){
    e.preventDefault();
    var wi = window.open('about:blank', '_blank');

    setTimeout(function(){ // 非同步,模擬ajax
        wi.location.href = 'http://google.com';
    }, 500);
});

如果網路正常能返回url地址倒不會造成太大的使用者體驗上的問題,就怕沒法正常返回url,這個時候使用者那塊就出現了一個空白頁,如果產品必須重新開啟且能返回url的機率非常高,相對來說這個方案沒那麼糟糕,如果產品沒法接受這種情況,那就老老實實重新整理當前頁吧。



相關文章