公司業務上有個場景,需請求后台獲取支付鏈接地址,再打開地址引導用戶購買。這樣的場景在其他企業應該也很場景。但是遇到個很常見的問題,Ajax后直接用window.open(url),會被瀏覽器作為廣告攔截。
解決方案:
方案一,在ajax請求前新開默認窗口:
let win = window.open("", "_blank");
let param = {
url: ...
data: {...}
}
axios.post(param).then((results)=>{
if (results.code =='sucess' ) {
_openWin(win, applyinfo)
}
});
//具體的新開窗口方法
_openWin (applyinfo){
let usAgent = navigator.userAgent.toLowerCase();
let url = wabpInfo.appTransUrl;
if(usAgent.indexOf('safari') > -1 && usAgent.indexOf("chrome") < 1) { //safari瀏覽器
if(url && win ){
win.location = url;
}
}else {
url && window.open(url);
}
}
方案二,ajax使用同步方式(網上提供)。
$.ajax({
type: 'post',
datatype: 'post',
async: false , //使用同步請求
url: .....
data: ...
})
這個方法在項目中嘗試時失敗了,依然會被瀏覽器攔截,使用Promise形式也未成功。
最后項目折中,推薦使用提前打開方案1,或引入用戶操作流程由用戶觸發新開窗口操作。
希望對大家有幫助。