国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > AJAX > 正文

Ajax請求響應(yīng)中用window.open打開新窗口被攔截的解決方法

2024-09-01 08:27:47
字體:
供稿:網(wǎng)友

一、問題描述

ajax 異步請求成功后需要新開窗口打開 url,使用的是 window.open() 方法,但是會被瀏覽器給攔截了,需要用戶點下。

二、問題分析

  瀏覽器之所以攔截新開窗口是因為該操作并不是用戶主動觸發(fā)的,所以它認為這是不安全的就攔截了,即使 ajax 回調(diào)函數(shù)中模擬執(zhí)行 click 或者 submit 等用戶行為(trigger('click')),瀏覽器也會認為不是由用戶主動觸發(fā)的,因此不能被安全執(zhí)行,所以被攔截。

說明:

1、如果是在 <a href="javascript:void(0)" onclick="fun()"></a> 這個中指定的 fun方法中調(diào)用 window.open()則不會被攔截,因為瀏覽器會認為是主動的。 但是在ajax請求的響應(yīng)中打開窗口是會被攔截的。

2、如果不是打開新窗口,而是改原來的網(wǎng)頁地址,可以使用window.location = newurl 來實現(xiàn),這樣不會被攔截。

三、解決方案

在ajax請求之前,先用window.open 打開一個空白窗口,然后在ajax的響應(yīng)函數(shù)中設(shè)置該窗口的location屬性為新的url。

代碼示例如:

function fun(){var tmpWin =window.open()ajax(xxx, handle(){ //回調(diào)函數(shù)。這是偽代碼,語法不準。var newurl = xxxxtmpWin.location = newurl;})}

上面方法,存在一個問題時,因為先打開了空白窗口,如果ajax請求失?。ňW(wǎng)絡(luò)或業(yè)務(wù)邏輯問題)后, 新窗口中就不會有正常的結(jié)果體現(xiàn),有可能造成用戶疑惑。
一個解決辦法是,當ajax出現(xiàn)問題時,可以考慮給出一個提示,如 tmpWin.document.write("服務(wù)器處理異常");

甚至為了防止ajax響應(yīng)時間過長,當窗口新建后,立即給出提示 tmpWin.document.write("服務(wù)器正在處理中,請稍后");

后面如果ajax正常返回,則因為設(shè)置了location值,原來打印的信息會被新的頁面信息覆蓋。

這里還有一種方法,但也有缺陷:

因為ajax可以設(shè)置為同步請求,這樣可以在ajax請求之后,利用window.open打開新窗口。如:

function fun(){var result;ajax({ //需要設(shè)置同步請求.....result = xxx .......}) if(result){window.open(xxxx)}}

上面的做法,因為是對ajax請求的結(jié)果判斷后,才打開新窗口,避免了上面說的問題。
但是因為是同步請求,在我們測試中發(fā)現(xiàn)一個問題,如果服務(wù)器響應(yīng)時間過長,一是界面會停頓(用戶體驗不好),二是新窗口會被攔截。

只有在服務(wù)器很快返回時才沒有問題。 我們測試時,在服務(wù)器代碼處理中sleep了1秒,發(fā)現(xiàn)新窗口就被攔截了。

四、小結(jié)

總結(jié)下,可以看出,對于在ajax返回后打開新窗口,沒有特別完美的方法。具體還是要根據(jù)自己系統(tǒng)的業(yè)務(wù)特點來采取相應(yīng)的做法。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 滨海县| 手机| 共和县| 府谷县| 台湾省| 盐亭县| 商南县| 光泽县| 来凤县| 横峰县| 芒康县| 广灵县| 云和县| 绥德县| 理塘县| 江津市| 十堰市| 封开县| 高淳县| 拜泉县| 卢龙县| 左权县| 子洲县| 林甸县| 石河子市| 化州市| 建宁县| 道真| 莱芜市| 策勒县| 横峰县| 永定县| 汨罗市| 道真| 监利县| 宜阳县| 宿迁市| 修文县| 鄂伦春自治旗| 那坡县| 农安县|