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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM