1. 程式人生 > >window.open在Safari中不能開啟的問題

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";
        }
    });
};