XDomainRequest之IE8和IE9發(fā)送跨域請(qǐng)求拒絕訪問(wèn)解決方法
IE8和IE9跨域請(qǐng)求“拒絕訪問(wèn)”
頁(yè)面中偶爾會(huì)有跨域的需求,之前使用過(guò)jsonp格式的,但是這次后端提供了可以跨域訪問(wèn)的接口。
接口表現(xiàn)如下:
1、在谷歌瀏覽器和火狐瀏覽器上正常
2、在IE10及以上瀏覽器上正常
3、在IE9和IE8瀏覽器上請(qǐng)求發(fā)送了,但是后端接口接收不到請(qǐng)求記錄,在【網(wǎng)絡(luò)】面板上也查詢不到接口發(fā)送記錄
在IE9和IE8瀏覽器上經(jīng)過(guò)打斷點(diǎn)調(diào)試,發(fā)現(xiàn)是請(qǐng)求send()之后,立馬被瀏覽器拋出異常“拒絕訪問(wèn)”
function _http(_url, _method, _data, _async, _success, _err) {
try {
// 1.創(chuàng)建XMLHttpRequest對(duì)象
var xhr = null;
xhr = new XMLHttpRequest();
// 2.打開(kāi)與服務(wù)器的鏈接
xhr.open(_method, _url, _async);
// 設(shè)置請(qǐng)求頭參數(shù)格式
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");
// 3.響應(yīng)就緒
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var response = JSON.parse(xhr.responseText);
_success && _success(response )
} else {
_err && _err(e)
}
}
}
;
// 4.發(fā)送給服務(wù)器
xhr.send(_data)
} catch (e) {// 捕獲異常
console.log(e)
_err && _err(e)
}
}
看來(lái)在IE8和IE9上使用XMLHttpRequest發(fā)送跨域請(qǐng)求是有問(wèn)題的。
在MDN上搜索了一下,官方文檔上描述IE8和IE9發(fā)送跨域請(qǐng)求使用XDomainRequest,IE10及以上可以直接使用XMLHttpRequest
XDomainRequestMDN鏈接如下
微軟官網(wǎng)的XDomainRequestMDN使用文章
微軟XDomainRequest文章的翻譯
以下是該方法的使用方法
// 創(chuàng)建跨域請(qǐng)求對(duì)象
var xdr = new XDomainRequest()
xdr對(duì)象含有的方法如下

XDomainRequest原型鏈上的方法如下

// 設(shè)置超時(shí)時(shí)間
xdr.timeout = 5000
//請(qǐng)求報(bào)頭Content-Type,可以設(shè)置,但是獲取的時(shí)候始終為""
xdr.contentType

// 讀取超時(shí)時(shí)間
xdr.timeout
// 超時(shí)事件
xdr.ontimeout = function () {};
// 請(qǐng)求異常事件
xdr.onload = function () {};
// 請(qǐng)求完成事件
xdr.onload = function () {};
// 請(qǐng)求進(jìn)度事件
xdr.onprogress = function () {};
//接口的響應(yīng)數(shù)據(jù)(只讀,雖然可以設(shè)置,但是設(shè)置的值不生效)
xdr.responseText
// 與服務(wù)器建立連接,只支持get 和 post 請(qǐng)求,XDomainRequest為異步請(qǐng)求,不支持設(shè)置同步還是異步
// http的頁(yè)面只能使用http接口,https頁(yè)面只能使用https接口
xdr.open(method, url);
// 發(fā)送請(qǐng)求,為避免兩個(gè)請(qǐng)求相隔時(shí)間太近沒(méi)有響應(yīng),使用setTimeout 執(zhí)行
setTimeout(function () {
xdr.send(_data);
}, 0);
// 中斷請(qǐng)求
xdr.abort();
function _xdrhttp(_url, _method, _data, _success, _err) {
try {
// 創(chuàng)建跨域請(qǐng)求對(duì)象
var xdr = new XDomainRequest()
, timer = null;
// 設(shè)置超時(shí)時(shí)間為5s
xdr.timeout = 5000
xdr.ontimeout = function() {
xdrError('操作失敗,請(qǐng)求超時(shí)。')
}
;
xdr.onerror = function(e) {
xdrError('操作失敗,請(qǐng)安裝驅(qū)動(dòng)程序后重試。')
}
;
xdr.onload = function() {
var response = JSON.parse(xdr.responseText);
_success && _success(response);
}
// 2.打開(kāi)與服務(wù)器的鏈接
xdr.open(_method, _url);
setTimeout(function() {
// 發(fā)送請(qǐng)求
xdr.send(_data);
}, 0);
} catch (e) {
xdrError('操作失敗,請(qǐng)安裝驅(qū)動(dòng)程序后重試。')
}
// 統(tǒng)一的錯(cuò)誤處理方法
function xdrError(msg) {
_err && _err({
status: 500,
message: msg,
ret: 'fail'
});
}
}使用XDomainRequest發(fā)送請(qǐng)求返回結(jié)果

問(wèn)題解決,皆大歡喜
在附一個(gè)已經(jīng)封裝好的 jQuery-ajaxTransport-XDomainRequest 插件鏈接
具體的使用可以參考下一篇文章。
相關(guān)文章
如何使用工具規(guī)范前端項(xiàng)目的commits與changelog技巧
這篇文章主要為大家介紹了如何使用工具規(guī)范前端項(xiàng)目的commits與changelog技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
JavaScript錯(cuò)誤處理和調(diào)試方法詳解
代碼審查是調(diào)試JavaScript的重要方法,因?yàn)樗试S多個(gè)開(kāi)發(fā)人員一起處理代碼庫(kù)并在開(kāi)發(fā)過(guò)程的早期發(fā)現(xiàn)錯(cuò)誤,這篇文章主要給大家介紹了關(guān)于JavaScript錯(cuò)誤處理和調(diào)試方法的相關(guān)資料,需要的朋友可以參考下2023-11-11
js canvas實(shí)現(xiàn)擦除效果示例代碼
擦除效果在我們?nèi)粘i_(kāi)發(fā)中也是時(shí)有見(jiàn)到的,通過(guò)擦除效果大大加強(qiáng)了與用戶的交互性,所以下面這篇文章主要給大家介紹了利用js和canvas實(shí)現(xiàn)擦除效果的相關(guān)資料,文中給出了詳細(xì)的介紹和示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-04-04
用js實(shí)現(xiàn)預(yù)覽待上傳的本地圖片
用js實(shí)現(xiàn)預(yù)覽待上傳的本地圖片...2007-03-03
基于Ionic3實(shí)現(xiàn)選項(xiàng)卡切換并重新加載echarts
這篇文章主要介紹了基于Ionic3實(shí)現(xiàn)選項(xiàng)卡切換并重新加載echarts,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
JS版獲取字符串真實(shí)長(zhǎng)度和取固定長(zhǎng)度的字符串函數(shù)
JS版獲取字符串真實(shí)長(zhǎng)度和取固定長(zhǎng)度的字符串函數(shù)...2007-04-04
解決微信小程序防止無(wú)法回到主頁(yè)的問(wèn)題
這篇文章主要介紹了解決微信小程序防止無(wú)法回到主頁(yè)的問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09

