jQuery的 $.ajax防止重復(fù)提交的兩種方法(推薦)
下面給大家?guī)?lái)兩種關(guān)于jquery 的ajax防止重復(fù)提交的解決方法,具體介紹如下所示:
1、第一種,對(duì)于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請(qǐng)求開始時(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ò)繁忙,請(qǐng)稍后再試...', 160); $('#submit_font').text('提交訂單'); $('.pay_alipay').attr('onclick','submitorder();');//改變提交按鈕上的文字并將按鈕設(shè)置為可點(diǎn)擊 }, complete: function(msg, textStatus) { //ajax請(qǐng)求完成時(shí)執(zhí)行 if(msg.result==1) { $('#submit_font').text('提交訂單'); $('.pay_alipay').attr('onclick','javascript:void();');//改變提交按鈕上的文字并將按鈕設(shè)置為可以點(diǎn)擊 } } });
2、利用jquery ajaxPrefilter中斷請(qǐng)求
1)Prefilters是一個(gè)預(yù)過(guò)濾器,在每個(gè)請(qǐng)求之前被發(fā)送和$.ajax()處理它們前處理。
options 是請(qǐng)求的選項(xiàng)
originalOptions 值作為提供給Ajax方法未經(jīng)修改的選項(xiàng),因此,沒(méi)有ajaxSettings設(shè)置中的默認(rèn)值
jqXHR 是請(qǐng)求的jqXHR對(duì)象
以上內(nèi)容的核心思想是維護(hù)一個(gè)隊(duì)列,發(fā)送請(qǐng)求時(shí),將請(qǐng)求加入隊(duì)列,請(qǐng)求響應(yīng)后,從隊(duì)列中清除,這就保證了在任一時(shí)刻只能有一個(gè)同樣的請(qǐng)求發(fā)送.
局限性:僅僅是前臺(tái)防止jQuery的ajax請(qǐng)求。對(duì)于非jquery的ajax請(qǐng)求,不起作用。因?yàn)槭褂玫氖莏query的ajaxPreFilter函數(shù),僅僅對(duì)jquery的ajax請(qǐng)求有作用。
2)按鈕每次點(diǎn)擊都會(huì)向后端發(fā)送請(qǐng)求,下面的demo實(shí)現(xiàn)了多次點(diǎn)擊按鈕之后,只保證最后一次點(diǎn)擊的請(qǐng)求能夠成功。
<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ù)回寫到頁(yè)面中 }, error:function(jqXHR, textStatus, errorThrown){ if(errorThrown != 'abort'){ alert('應(yīng)用加載失??!'); } } }); <!-- 異步加載應(yīng)用列表結(jié)束 --> }); </script>
調(diào)用abort后jquery會(huì)執(zhí)行error的方法,拋出abort的異常信息??梢允褂靡韵路绞絽^(qū)分出該類型的異常。
3)注意事項(xiàng):對(duì)于嵌套的點(diǎn)擊事件的代碼,是不起作用的。
$('.btn-cancel-all').live('click',function() { $('.confirm-dialog .confirm').live('click',function() { $.ajax({ //這里面的ajax事件是不能起作用的 }) } }
以上所述是小編給大家介紹的jQuery的 $.ajax防止重復(fù)提交的兩種方法(推薦),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
【經(jīng)典源碼收藏】基于jQuery的項(xiàng)目常見函數(shù)封裝集合
這篇文章主要介紹了基于jQuery的項(xiàng)目常見函數(shù)封裝集合,總結(jié)分析 jQuery常見功能的函數(shù)封裝,便于在項(xiàng)目開發(fā)中直接使用,需要的朋友可以參考下2016-06-06IE中jquery.form中ajax提交沒(méi)反應(yīng)解決方法分享
用jquery form插件,進(jìn)行ajax提交,本來(lái)可以用,好好地,突然發(fā)現(xiàn),firefox,opera等可以提交,ie的success函數(shù)運(yùn)行了2012-09-09jQuery實(shí)現(xiàn)html table行Tr的復(fù)制、刪除、計(jì)算功能
這篇文章主要介紹了jQuery實(shí)現(xiàn)html table行Tr的復(fù)制、刪除、計(jì)算功能,涉及jQuery針對(duì)table表格的常見復(fù)制、添加、刪除與計(jì)算行數(shù)等簡(jiǎn)單操作技巧,需要的朋友可以參考下2017-07-07Jquery easyui 實(shí)現(xiàn)動(dòng)態(tài)樹
本文給大家介紹jquery easyui實(shí)現(xiàn)動(dòng)態(tài)樹,本文通過(guò)代碼實(shí)例相結(jié)合的方式給大家展示jquery easyui實(shí)現(xiàn)動(dòng)態(tài)樹的過(guò)程,感興趣的朋友一起學(xué)習(xí)吧2015-11-11jquery 日期控件datepicker屬性詳細(xì)解析
本文是對(duì)jquery中日期控件datepicker的屬性進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11