jq防止ajax多次提交的方法
阿新 • • 發佈:2017-09-09
console csdn min complete num href config 中斷 ring
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
jq防止ajax多次提交的方法