jq防止ajax多次提交的方法


1、第一種,對於onclick事件觸發的的ajax

可以采用如下方法: 

即在beforeSend中使點擊按鈕不可用,ajax結果返回后置為可用

$.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 ()
{ //觸發ajax請求開始時執行
$( '#submit_font' ).text( '提交訂單中...' );
$( '.pay_alipay' ).attr( 'onclick' , 'javascript:void();' ); //改變提交按鈕上的文字並將按鈕設置為不可點擊
},
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();' ); //改變提交按鈕上的文字並將按鈕設置為可點擊
}
},
error: function (textStatus)
{
$.Alert( '網絡繁忙,請稍后再試...' , 160);
$( '#submit_font' ).text( '提交訂單' );
$( '.pay_alipay' ).attr( 'onclick' , 'submitorder();' ); //改變提交按鈕上的文字並將按鈕設置為可點擊
},
complete: function (msg, textStatus)
{
//ajax請求完成時執行
if (msg.result==1)
{
$( '#submit_font' ).text( '提交訂單' );
$( '.pay_alipay' ).attr( 'onclick' , 'javascript:void();' ); //改變提交按鈕上的文字並將按鈕設置為可以點擊
}
}
});

2、利用jquery ajaxPrefilter中斷請求

1)Prefilters是一個預過濾器,在每個請求之前被發送和$.ajax()處理它們前處理。

options 是請求的選項

originalOptions 值作為提供給Ajax方法未經修改的選項,因此,沒有ajaxSettings設置中的默認值

jqXHR 是請求的jqXHR對象

以上內容的核心思想是維護一個隊列,發送請求時,將請求加入隊列,請求響應后,從隊列中清除,這就保證了在任一時刻只能有一個同樣的請求發送.

局限性:僅僅是前台防止jQuery的ajax請求。對於非jquery的ajax請求,不起作用。因為使用的是jquery的ajaxPreFilter函數,僅僅對jquery的ajax請求有作用。

2)按鈕每次點擊都會向后端發送請求,下面的demo實現了多次點擊按鈕之后,只保證最后一次點擊的請求能夠成功。

<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(); //放棄后觸發的提交
pendingRequests[key].abort(); // 放棄先觸發的提交
}
var complete = options.complete;
options.complete = function (jqXHR, textStatus) {
pendingRequests[key] = null ;
if (jQuery.isFunction(complete)) {
complete.apply( this , arguments);
}
};
});
<!-- 異步加載應用列表開始 -->
$( "#button1" ).live( "click" , function () {
$.ajax( 'config/ajax/appinfoListFetcher.json' , {
type: 'POST' ,
data: {param1:1,
param2:2,
},
success: function (res){
//后端數據回寫到頁面中
},
error: function (jqXHR, textStatus, errorThrown){
if (errorThrown != 'abort' ){
alert( '應用加載失敗!' );
}
}
});
<!-- 異步加載應用列表結束 -->
});
</script>

調用abort后jquery會執行error的方法,拋出abort的異常信息。可以使用以下方式區分出該類型的異常。

3)注意事項:對於嵌套的點擊事件的代碼,是不起作用的。

$( '.btn-cancel-all' ).live( 'click' , function ()
{
$( '.confirm-dialog .confirm' ).live( 'click' , function ()
{
$.ajax({
//這里面的ajax事件是不能起作用的
})
}
}

以上所述是小編給大家介紹的jQuery的 $.ajax防止重復提交的兩種方法(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

原文鏈接:http://blog.csdn.net/everything1209/article/details/52626151


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM