jq防止ajax多次提交的方法
Posted Y~forward
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(
‘提交订单中...‘
);
},
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多次提交的方法的主要内容,如果未能解决你的问题,请参考以下文章
Javascript在ajax提交过程中页面显示加载中,请等待效果,并在提交过程中限制确定按钮防止多次提交,提交完成后,解除提交限制