jQuery的 $.ajax防止重復(fù)提交的兩種方法(推薦)
下面給大家?guī)韮煞N關(guān)于jquery 的ajax防止重復(fù)提交的解決方法,具體介紹如下所示:
1、第一種,對于onclick事件觸發(fā)的的ajax
可以采用如下方法:
即在beforeSend中使點(diǎn)擊按鈕不可用,ajax結(jié)果返回后置為可用
$.ajax(
{
type: 'POST',
url: APP+'?m=Shopping&a=ajaxSubmitorder&sid='+sid+'&src='+src,
cache:false,
dataType: 'json',
data: {'src':src,"uid": uid,'shipping_id':shipping_id,'order_amount':order_amount,'amount':amount,'postscript':postscript,'addr_id':addr_id},
async: false,
beforeSend:function()
{ //觸發(fā)ajax請求開始時(shí)執(zhí)行
$('#submit_font').text('提交訂單中...');
$('.pay_alipay').attr('onclick','javascript:void();');//改變提交按鈕上的文字并將按鈕設(shè)置為不可點(diǎn)擊
},
success: function (msg, textStatus)
{
if(msg.result==1)
{
$.Alert('成功提交訂單', 160);
window.location.href=APP+'?m=Pay&a=index&sid='+ sid + '&fuid='+ fuid + '&parent_order_sn='+msg.parent_order_sn;
}
else
{
$.Alert(msg.msg, 160);
$('#submit_font').text('提交訂單');
$('.pay_alipay').attr('onclick','submitorder();');//改變提交按鈕上的文字并將按鈕設(shè)置為可點(diǎn)擊
}
},
error: function (textStatus)
{
$.Alert('網(wǎng)絡(luò)繁忙,請稍后再試...', 160);
$('#submit_font').text('提交訂單');
$('.pay_alipay').attr('onclick','submitorder();');//改變提交按鈕上的文字并將按鈕設(shè)置為可點(diǎn)擊
},
complete: function(msg, textStatus)
{
//ajax請求完成時(shí)執(zhí)行
if(msg.result==1)
{
$('#submit_font').text('提交訂單');
$('.pay_alipay').attr('onclick','javascript:void();');//改變提交按鈕上的文字并將按鈕設(shè)置為可以點(diǎn)擊
}
}
});
2、利用jquery ajaxPrefilter中斷請求
1)Prefilters是一個(gè)預(yù)過濾器,在每個(gè)請求之前被發(fā)送和$.ajax()處理它們前處理。
options 是請求的選項(xiàng)
originalOptions 值作為提供給Ajax方法未經(jīng)修改的選項(xiàng),因此,沒有ajaxSettings設(shè)置中的默認(rèn)值
jqXHR 是請求的jqXHR對象
以上內(nèi)容的核心思想是維護(hù)一個(gè)隊(duì)列,發(fā)送請求時(shí),將請求加入隊(duì)列,請求響應(yīng)后,從隊(duì)列中清除,這就保證了在任一時(shí)刻只能有一個(gè)同樣的請求發(fā)送.
局限性:僅僅是前臺防止jQuery的ajax請求。對于非jquery的ajax請求,不起作用。因?yàn)槭褂玫氖莏query的ajaxPreFilter函數(shù),僅僅對jquery的ajax請求有作用。
2)按鈕每次點(diǎn)擊都會向后端發(fā)送請求,下面的demo實(shí)現(xiàn)了多次點(diǎn)擊按鈕之后,只保證最后一次點(diǎn)擊的請求能夠成功。
<button id="button1">button1</button>
<button id="button2">button2</button>
<button id="button3">button3</button>
<script type="text/javascript" src="jquery.min.js"></script>
<script>
var pendingRequests = {};
jQuery.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
var key = options.url;
console.log(key);
if (!pendingRequests[key]) {
pendingRequests[key] = jqXHR;
}else{
//jqXHR.abort(); //放棄后觸發(fā)的提交
pendingRequests[key].abort(); // 放棄先觸發(fā)的提交
}
var complete = options.complete;
options.complete = function(jqXHR, textStatus) {
pendingRequests[key] = null;
if (jQuery.isFunction(complete)) {
complete.apply(this, arguments);
}
};
});
<!-- 異步加載應(yīng)用列表開始 -->
$("#button1").live("click", function() {
$.ajax('config/ajax/appinfoListFetcher.json', {
type:'POST',
data: {param1:1,
param2:2,
},
success: function(res){
//后端數(shù)據(jù)回寫到頁面中
},
error:function(jqXHR, textStatus, errorThrown){
if(errorThrown != 'abort'){
alert('應(yīng)用加載失??!');
}
}
});
<!-- 異步加載應(yīng)用列表結(jié)束 -->
});
</script>
調(diào)用abort后jquery會執(zhí)行error的方法,拋出abort的異常信息??梢允褂靡韵路绞絽^(qū)分出該類型的異常。
3)注意事項(xiàng):對于嵌套的點(diǎn)擊事件的代碼,是不起作用的。
$('.btn-cancel-all').live('click',function()
{
$('.confirm-dialog .confirm').live('click',function()
{
$.ajax({
//這里面的ajax事件是不能起作用的
})
}
}
以上所述是小編給大家介紹的jQuery的 $.ajax防止重復(fù)提交的兩種方法(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
在JQuery dialog里的服務(wù)器控件 事件失效問題
今天遇到個(gè)問題,在dialog中放了服務(wù)器端的空間dropdownlist,但是寫selectindexchange事件卻怎么也觸發(fā)不了,然后就在網(wǎng)上搜,終于看到有個(gè)哥們解決了這個(gè)問題,真的謝謝他。2010-12-12
jQuery頁面元素動態(tài)添加后綁定事件丟失方法,非 live
這篇文章主要介紹了jQuery頁面元素動態(tài)添加后綁定事件丟失方法,非 live 的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06
通過jQuery源碼學(xué)習(xí)javascript(三)
承接上兩篇繼續(xù)寫下去。我盡量把我明白的地方給大家說清楚。有些大家的提問我也有點(diǎn)搞不明白,如果有人能解答,再好不過了2012-12-12
jQuery實(shí)現(xiàn)原理的模擬代碼 -6 代碼下載
前幾篇文章中的示例代碼,去掉了幾個(gè) bug, 這里一起提供下載。2010-08-08
jQuery之網(wǎng)頁換膚實(shí)現(xiàn)代碼
用jQuery做網(wǎng)頁換膚確實(shí)是很一個(gè)很巧妙,很好的選擇,這是本人在學(xué)習(xí)jQuery中學(xué)的知識,感覺很有用,寫了下來,希望大家有更好的方法或者代碼不足的地方請諒解,本人也是初學(xué)者啊,希望大家互相勉勵互相學(xué)習(xí)。2011-04-04
jQuery制作簡潔的多級聯(lián)動Select下拉框
省市多級聯(lián)動的select下拉框有很多種實(shí)現(xiàn)方式,度娘上隨便一搜就一大堆,今天我們來討論的這款特效,代碼卻很簡潔,兼容性也非常棒,推薦給大家。2014-12-12
jQuery實(shí)現(xiàn)仿Alipay支付寶首頁全屏焦點(diǎn)圖切換特效
這篇文章主要介紹了jQuery實(shí)現(xiàn)仿Alipay支付寶首頁全屏焦點(diǎn)圖切換特效,涉及jQuery插件jquery.kinMaxShow的相關(guān)使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
jQuery模仿阿里云購買服務(wù)器選擇購買時(shí)間長度的代碼
jQuery仿阿里云購買服務(wù)器選擇時(shí)間長度,操作簡單,只需點(diǎn)擊所要選的時(shí)間段,對實(shí)現(xiàn)代碼感興趣的朋友參考下2016-04-04

