window.open在Safari中不能打開的問題

在調移動支付問題的時候遇到過,用window.open打開一個微信支付連接,喚醒移動支付,在IOS下死活喚醒不了,是js代碼衝突問題...是click事件IOS下不兼容問題...最後定位到window.open語句,以後改成window.loaction.href,奇蹟般的能夠喚醒支付,所以,也就很直觀的證實了在Safari下用window.open是有問題的jquery

緣由:大部分現代的瀏覽器(Chrome/Firefox/IE 10+/Safari)都默認開啓了阻止彈出窗口的策略,緣由是window.open被廣告商濫用,嚴重影響用戶的使用。這個阻止彈出窗口的操做,並非直接封殺window.open(),而是會根據用戶的行爲來判斷此次window.open()是否屬於流氓操做。ajax

若是是由用戶觸發的動做所引發的 window.open 就不會被瀏覽器所阻止,好比寫在 onclick 這些事件 handler 裏的,但若是是代碼本身觸發的就會被阻止。json

那麼,咱們能夠知道,在Safari中沒法open新窗口,緣由是Safari的安全機制將其阻擋。瀏覽器

並非全部地方都沒法正常使用,在一些ajax或者jquery的getjson等回調代碼中只要調用window.open都失效。緣由是蘋果的安全策略攔截。安全

解決辦法有4種:bash

(1)用window.location.replace()來替代,【或者改變location.href,能夠解決,缺點就是否是新開的窗口】微信

(2)蘋果系統設置,偏好設置->安全性,去掉阻止彈窗的複選框就ok了。 【不建議,會改變用戶的設置】函數

(3)在回到函數中生成一個連接,讓用戶再次點擊下,由於連接是不管如何不會被攔截的。【不建議,多加了一個動做】微信支付

(4)在回調代碼以前打開一個空窗口,例如 var w=window.open(xxx); 而後在回調函數中設置它的location。【推薦】ui

例如w.location=yyy; 具體分析和代碼參考:

var openWin = function(){
    var winRef = window.open("url","_blank");
    $.ajax({
        type: '',
        url: '',
        data: '',
        ......
        success:function(json){
            winRef.location = "新的url";
        }
    });
};
複製代碼
相關文章
相關標籤/搜索