window.open在Safari中不能開啟的問題
在調移動支付問題的時候遇到過,用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"; } }); };