最近偶然看到之前封裝的ajax公用方法,發(fā)現(xiàn)之前的寫法里面加入了一個(gè)dom對(duì)象,在發(fā)送ajax請(qǐng)求之前先用jQuery的off函數(shù)取消dom對(duì)象的onClick事件,等待ajax處理完成后重新給dom對(duì)象綁定onClick事件,總覺(jué)得很怪異,所以就查了下大神們的解決方法。
$(function(){
var _c = {};
_c.ajax = function(url, method, param, onSuccess, onFailure){
$.ajax({
url: url,
type: method,
data: param,
dataType: "json",
})
.done(function(data){
onSuccess(data);
})
.fail(function(error){
//過(guò)濾掉被拋棄的請(qǐng)求
if (error.readyState === 0 && error.status === 0) {
return false;
}
onFailure(JSON.parse(error.responseText));
});
};
_c.requestUrl = {};
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
var key = options.url;
if (typeof(_c.requestUrl[key]) === 'undefined') {
_c.requestUrl[key] = jqXHR;
} else {
//放棄當(dāng)前觸發(fā)的請(qǐng)求
jqXHR.abort();
//放棄之前觸發(fā)的請(qǐng)求
//_c.requestUrl[key].abort();
}
options.complete = function(jqXHR, textStatus) {
delete _c.requestUrl[key];
};
});
});
- jQuery.ajaxPrefilter() 函數(shù)用于**指定預(yù)先處理Ajax參數(shù)選項(xiàng)的回調(diào)函數(shù)。
- 通俗的將就是ajax在發(fā)送到web服務(wù)器之前,可以調(diào)用這個(gè)方法來(lái)改變請(qǐng)求的內(nèi)容。
- 大致的實(shí)現(xiàn)方法就是將url存入一個(gè)全局變量中,請(qǐng)求之前檢查變量中是否存在當(dāng)前請(qǐng)求的url值,若存在則拋棄當(dāng)前的請(qǐng)求,待相同的上一次請(qǐng)求處理完成后,在變量數(shù)組中刪除當(dāng)前的url,就可再次請(qǐng)求了。
- 總結(jié):對(duì)比之前的方法,代碼量減少不少,而且也不必關(guān)注dom對(duì)象了,下一個(gè)關(guān)注點(diǎn)可能就是限制請(qǐng)求的頻率了,比如說(shuō)3秒內(nèi)同一個(gè)接口無(wú)法請(qǐng)求。