91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么解決window.open被瀏覽器攔截的問題

發布時間:2022-02-25 16:08:51 來源:億速云 閱讀:334 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“怎么解決window.open被瀏覽器攔截的問題”,內容詳細,步驟清晰,細節處理妥當,希望這篇“怎么解決window.open被瀏覽器攔截的問題”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

現象

最近在做項目的時候碰到了使用window.open被瀏覽器攔截的情況,搞得人無比郁悶啊,雖然在自己的環境可以對頁面進行放行,但是對用戶來說,不能要求用戶都來通過攔截。何況當出現攔截時,很多小白根本不知道發生了啥,不知道在哪里看被攔截的頁面,簡直悲催啊~~。

另外,可以發現,當window.open為用戶觸發事件內部或者加載時,不會被攔截,一旦將彈出代碼移動到ajax或者一段異步代碼內部,馬上就出現被攔截的表現了。

原因分析&深入研究

當瀏覽器檢測到非用戶操作產生的新彈出窗口,則會對其進行阻止。因為瀏覽器認為這不是一個用戶希望看到的頁面。

比如對js中直接執行的,如下代碼:

js code:

//  直接打開一個頁面
window.open('//www.baidu.com', '_blank');

瀏覽器 ie8 chrome 40 firefox 34 opera 27 safari 5.1.7

是否阻止彈出 N N Y Y Y 而對于如下代碼:

js code:

  document.body.addEventListener('click', function() {
        window.open('//www.baidu.com', '_blank');
    });

所有瀏覽器都不會攔截。

綜上所述,各瀏覽器對攔截時機的判斷不一致,而對于放在ajax回調中的代碼,反應又不相同了,這里就不再贅述。但是,被瀏覽器攔截我們代碼中要彈出的窗口并不是程序員所希望的。

解決方案:

1、使用a標簽替代

給出如下函數,將此函數綁定到click的事件回調中,就可以避免大部分瀏覽器對窗口彈出的攔截:

js code:

function newWin(url, id) {

          var a = document.createElement('a');
          a.setAttribute('href', url);
          a.setAttribute('target', '_blank');
          a.setAttribute('id', id);
          // 防止反復添加
          if(!document.getElementById(id)) document.body.appendChild(a);
          a.click();
}

2、使用form的submit方法打開一個頁面

這種方法需要構造一個from,然后由js代碼觸發form的submit,將表單提交到一個新的頁面,代碼較長,在這里就不寫了,大家知道有這種方案就行了。

大家注意,以上兩種方法不適合放在ajax的回調函數中,如果放在回調函數中,依然會被瀏覽器攔截。
3、終極解決方案--先彈出窗口,然后重定向

第三種方案,其實是一種變通方案,核心思想是:先通過用戶點擊打開頁面,然后再對頁面進行重定向。示例代碼如下。

js code:

xx.addEventListener('click', function () {
        // 打開頁面,此處最好使用提示頁面
        var newWin = window.open('loading page');

        ajax().done(function() {
            // 重定向到目標頁面
            newWin.location.href = 'target url';
        });
    });

以上方法其實是打開了兩個地址,所以建議大家打開第一個地址的時候給出一個類似‘當前頁面正在加載中,請稍后。。’的簡單提示頁,這樣可以避免打開兩次真正的目標頁面,讓用戶察覺到頁面的重定向。
解決方法二:

<a href="javascript:;" onclick="dialog();">點擊彈窗</a>

<script>
function dialog(){
    $.ajax({
        url: 'url',
        type: 'POST',
        dataType: 'json',
        async: false,  // 此處必須定義為同步
        data: {param1: 'value1'},
        success: function(data){
            window.open(data.url, '_blank');  //發起彈窗
        }
    })
}    
</script>

該方法弊端:

實測能解決大部分瀏覽器的攔截問題,但是解決不了安全軟件的攔截(360不會攔截,但是QQ管家會攔截)

讀到這里,這篇“怎么解決window.open被瀏覽器攔截的問題”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

唐山市| 新化县| 慈溪市| 绥滨县| 长宁区| 临邑县| 封丘县| 璧山县| 新乡市| 图片| 沂南县| 五莲县| 义乌市| 泸定县| 玉环县| 皮山县| 金乡县| 绥棱县| 临朐县| 成安县| 盖州市| 台州市| 利川市| 西林县| 伊吾县| 延安市| 囊谦县| 阜新| 观塘区| 阿图什市| 彭水| 咸阳市| 文登市| 镇宁| 十堰市| 常州市| 承德县| 乐山市| 嘉荫县| 义马市| 台东县|