在調移動支付問題的時候遇到過,用window.open打開一個微信支付鏈接,喚醒移動支付,在IOS下死活喚醒不了,是js代碼沖突問題...是click事件IOS下不兼容問題...最后定位到window.open語句,之后改為window.loaction.href,奇跡般的可以喚醒支付,因此,也就很直觀的證明了在Safari下用window.open是有問題的
原因:大部分現代的瀏覽器(Chrome/Firefox/IE 10+/Safari)都默認開啟了阻止彈出窗口的策略,原因是window.open被廣告商濫用,嚴重影響用戶的使用。這個阻止彈出窗口的操作,並不是直接封殺window.open(),而是會根據用戶的行為來判斷這次window.open()是否屬於流氓操作。
如果是由用戶觸發的動作所引起的 window.open 就不會被瀏覽器所阻止,比如寫在 onclick 這些事件 handler 里的,但如果是代碼自己觸發的就會被阻止。
那么,我們可以知道,在Safari中無法open新窗口,原因是Safari的安全機制將其阻擋。
並不是所有地方都無法正常使用,在一些ajax或者jquery的getjson等回調代碼中只要調用window.open都失效。原因是蘋果的安全策略攔截。
解決辦法有4種:
(1)用window.location.replace()來替代,【或者改變location.href,可以解決,缺點就是不是新開的窗口】
(2)蘋果系統設置,偏好設置->安全性,去掉阻止彈窗的復選框就ok了。 【不建議,會改變用戶的設置】
(3)在回到函數中生成一個鏈接,讓用戶再次點擊下,因為鏈接是無論如何不會被攔截的。【不建議,多加了一個動作】
(4)在回調代碼之前打開一個空窗口,例如 var w=window.open(xxx); 然后在回調函數中設置它的location。【推薦】
例如w.location=yyy; 具體分析和代碼參考:
var openWin = function(){
var winRef = window.open("url","_blank");
$.ajax({
type: '',
url: '',
data: '',
......
success:function(json){
winRef.location = "新的url";
}
});
};