麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開(kāi)發(fā) > HTML5 > 正文

詳解window.open被瀏覽器攔截的解決方案

2024-09-05 07:22:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

現(xiàn)象

最近在做項(xiàng)目的時(shí)候碰到了使用window.open被瀏覽器攔截的情況,搞得人無(wú)比郁悶啊,雖然在自己的環(huán)境可以對(duì)頁(yè)面進(jìn)行放行,但是對(duì)用戶來(lái)說(shuō),不能要求用戶都來(lái)通過(guò)攔截。何況當(dāng)出現(xiàn)攔截時(shí),很多小白根本不知道發(fā)生了啥,不知道在哪里看被攔截的頁(yè)面,簡(jiǎn)直悲催啊~~。

另外,可以發(fā)現(xiàn),當(dāng)window.open為用戶觸發(fā)事件內(nèi)部或者加載時(shí),不會(huì)被攔截,一旦將彈出代碼移動(dòng)到ajax或者一段異步代碼內(nèi)部,馬上就出現(xiàn)被攔截的表現(xiàn)了。

原因分析&深入研究

當(dāng)瀏覽器檢測(cè)到非用戶操作產(chǎn)生的新彈出窗口,則會(huì)對(duì)其進(jìn)行阻止。因?yàn)闉g覽器認(rèn)為這不是一個(gè)用戶希望看到的頁(yè)面。

比如對(duì)js中直接執(zhí)行的,如下代碼:

js code:

//  直接打開(kāi)一個(gè)頁(yè)面window.open('//www.baidu.com', '_blank');

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

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

js code:

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

所有瀏覽器都不會(huì)攔截。

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

解決方案:

1、使用a標(biāo)簽替代

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

js code:

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

2、使用form的submit方法打開(kāi)一個(gè)頁(yè)面

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

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

第三種方案,其實(shí)是一種變通方案,核心思想是:先通過(guò)用戶點(diǎn)擊打開(kāi)頁(yè)面,然后再對(duì)頁(yè)面進(jìn)行重定向。示例代碼如下。

js code:

xx.addEventListener('click', function () {        // 打開(kāi)頁(yè)面,此處最好使用提示頁(yè)面        var newWin = window.open('loading page');        ajax().done(function() {            // 重定向到目標(biāo)頁(yè)面            newWin.location.href = 'target url';        });    });

以上方法其實(shí)是打開(kāi)了兩個(gè)地址,所以建議大家打開(kāi)第一個(gè)地址的時(shí)候給出一個(gè)類似‘當(dāng)前頁(yè)面正在加載中,請(qǐng)稍后。。’的簡(jiǎn)單提示頁(yè),這樣可以避免打開(kāi)兩次真正的目標(biāo)頁(yè)面,讓用戶察覺(jué)到頁(yè)面的重定向。
解決方法二:

<a href="javascript:;" onclick="dialog();">點(diǎn)擊彈窗</a><script>function dialog(){    $.ajax({        url: 'url',        type: 'POST',        dataType: 'json',        async: false,  // 此處必須定義為同步        data: {param1: 'value1'},        success: function(data){            window.open(data.url, '_blank');  //發(fā)起彈窗        }    })}    </script>

該方法弊端:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产喷白浆10p | 国产羞羞视频在线观看免费应用 | 激情久久精品 | 亚洲精品无码不卡在线播放he | 久久精品一区二区三区不卡牛牛 | 91 在线免费观看 | 福利在线国产 | 国产在线观看av | 日本特级a一片免费观看 | 亚洲小视频在线 | 欧美精品一二三区 | 美女黄色影院 | 91成人免费版| 成人性视频免费网站下载软件 | 成人爱爱电影 | 精品国产一区二 | 国产免费一级 | 一级做a爱视频 | 羞羞视频.www在线观看 | 国产一区二区免费在线观看视频 | av亚洲在线观看 | 可以免费看av | 欧美一级全黄 | 美女视频在线观看黄 | 成人午夜免费国产 | h视频免费看 | 精品午夜影院 | 最新91在线视频 | 欧美亚洲一级 | 国产99视频精品免视看9 | 免费黄色入口 | 久久久一区二区三区四区 | 一级毛片真人免费播放视频 | 亚洲日本高清 | 北原夏美av| 久久男 | 久久精品性视频 | 久久免费视频精品 | 在线a亚洲视频播放在线观看 | 精品亚洲在线 | 久久久一区二区 |