摘要:原因分析深入研究當瀏覽器檢測到非用戶操作產(chǎn)生的新彈出窗口,則會對其進行阻止。但是,被瀏覽器攔截我們代碼中要彈出的窗口并不是程序員所希望的。
現(xiàn)象
最近在做項目的時候碰到了使用window.open被瀏覽器攔截的情況,搞得人無比郁悶啊,雖然在自己的環(huán)境可以對頁面進行放行,但是對用戶來說,不能要求用戶都來通過攔截。何況當出現(xiàn)攔截時,很多小白根本不知道發(fā)生了啥,不知道在哪里看被攔截的頁面,簡直悲催啊~~。
另外,可以發(fā)現(xiàn),當window.open為用戶觸發(fā)事件內(nèi)部或者加載時,不會被攔截,一旦將彈出代碼移動到ajax或者一段異步代碼內(nèi)部,馬上就出現(xiàn)被攔截的表現(xiàn)了。
原因分析&深入研究
當瀏覽器檢測到非用戶操作產(chǎn)生的新彈出窗口,則會對其進行阻止。因為瀏覽器認為這不是一個用戶希望看到的頁面。
比如對js中直接執(zhí)行的,如下代碼:
js code:
// 直接打開一個頁面 window.open("http://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("http://www.baidu.com", "_blank"); });
所有瀏覽器都不會攔截。
綜上所述,各瀏覽器對攔截時機的判斷不一致,而對于放在ajax回調(diào)中的代碼,反應又不相同了,這里就不再贅述。但是,被瀏覽器攔截我們代碼中要彈出的窗口并不是程序員所希望的。
解決方案:
1、使用a標簽替代
給出如下函數(shù),將此函數(shù)綁定到click的事件回調(diào)中,就可以避免大部分瀏覽器對窗口彈出的攔截:
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代碼觸發(fā)form的submit,將表單提交到一個新的頁面,代碼較長,在這里就不寫了,大家知道有這種方案就行了。
大家注意,以上兩種方法不適合放在ajax的回調(diào)函數(shù)中,如果放在回調(diào)函數(shù)中,依然會被瀏覽器攔截。
3、終極解決方案--先彈出窗口,然后重定向
第三種方案,其實是一種變通方案,核心思想是:先通過用戶點擊打開頁面,然后再對頁面進行重定向。示例代碼如下。
js code:
xx.addEventListener("click", function () { // 打開頁面,此處最好使用提示頁面 var newWin = window.open("loading page"); ajax().done(function() { // 重定向到目標頁面 newWin.location.href = "target url"; }); });
以上方法其實是打開了兩個地址,所以建議大家打開第一個地址的時候給出一個類似‘當前頁面正在加載中,請稍后。?!暮唵翁崾卷?,這樣可以避免打開兩次真正的目標頁面,讓用戶察覺到頁面的重定向。
解決方法二:
點擊彈窗
該方法弊端:
實測能解決大部分瀏覽器的攔截問題,但是解決不了安全軟件的攔截(360不會攔截,但是QQ管家會攔截)
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/54210.html
摘要:使用包裝一下,也可以防止被瀏覽器攔截。注意這里的超時時間不能太短,否則也會被攔截。我們會遇到想要彈出一個窗口,可是卻是在事件執(zhí)行后,才去彈出來的,這時就會被瀏覽器攔截,我們可以通過下面的方法來避免先用打開一個窗口,然后修改地址。 最近公司開發(fā)的一個項目,平凡用到下載各種類型的文件,但是例如.txt,.jpg,.pdf格式的文件呢瀏覽器會在當前窗口直接打開,影響用戶體驗,嘗試各種方案和百...
摘要:使用包裝一下,也可以防止被瀏覽器攔截。注意這里的超時時間不能太短,否則也會被攔截。我們會遇到想要彈出一個窗口,可是卻是在事件執(zhí)行后,才去彈出來的,這時就會被瀏覽器攔截,我們可以通過下面的方法來避免先用打開一個窗口,然后修改地址。 最近公司開發(fā)的一個項目,平凡用到下載各種類型的文件,但是例如.txt,.jpg,.pdf格式的文件呢瀏覽器會在當前窗口直接打開,影響用戶體驗,嘗試各種方案和百...
摘要:使用包裝一下,也可以防止被瀏覽器攔截。注意這里的超時時間不能太短,否則也會被攔截。我們會遇到想要彈出一個窗口,可是卻是在事件執(zhí)行后,才去彈出來的,這時就會被瀏覽器攔截,我們可以通過下面的方法來避免先用打開一個窗口,然后修改地址。 最近公司開發(fā)的一個項目,平凡用到下載各種類型的文件,但是例如.txt,.jpg,.pdf格式的文件呢瀏覽器會在當前窗口直接打開,影響用戶體驗,嘗試各種方案和百...
摘要:目前就不能避免被攔截了,只能通知用戶,讓用戶去給被攔截的頁面新添加信任。判斷跳轉(zhuǎn)頁面是否被攔截了。如果已經(jīng)攔截,就給他用戶提示提示的方式可以是引導用戶去解決被攔截問題添加信任您的支付界面窗口已經(jīng)被瀏覽器攔截 知識簡說 window.open 命令在用戶操作(trusted events)時, 才會正常的打開應該頁面而不會被瀏覽器攔截 ps : 什么是 trusted events tr...
閱讀 3733·2021-09-22 15:15
閱讀 3627·2021-08-12 13:24
閱讀 1363·2019-08-30 15:53
閱讀 1877·2019-08-30 15:43
閱讀 1233·2019-08-29 17:04
閱讀 2843·2019-08-29 15:08
閱讀 1664·2019-08-29 13:13
閱讀 3168·2019-08-29 11:06