jQuery的 $.ajax防止重复提交的两种方法(推荐)


Posted in Javascript onOctober 14, 2016

下面给大家带来两种关于jquery 的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防止重复提交的两种方法(推荐),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js文件Cookie存取值示例代码
Feb 20 Javascript
JavaScript中自定义事件用法分析
Dec 23 Javascript
javascript实现省市区三级联动下拉框菜单
Nov 17 Javascript
AngularJS身份验证的方法
Feb 17 Javascript
JavaScript类型系统之布尔Boolean类型详解
Jun 26 Javascript
用js实现简单算法的实例代码
Sep 24 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
微信小程序 解析网页内容详解及实例
Feb 22 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
Sep 25 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
Mar 07 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
Vuex实现简单购物车
Jan 10 Vue.js
jQuery如何防止Ajax重复提交
Oct 14 #Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
Oct 14 #Javascript
浅析JS中对函数function的理解(基础篇)
Oct 14 #Javascript
js插件Jcrop自定义截取图片功能
Oct 14 #Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
Oct 14 #Javascript
Js动态设置rem来实现移动端字体的自适应代码
Oct 14 #Javascript
JS动态计算移动端rem的解决方案
Oct 14 #Javascript
You might like
php实现发送微信模板消息的方法
2015/03/07 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
js下用层来实现select的title提示属性
2010/02/23 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
了解重排与重绘
2019/05/29 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
美国电视购物HSN官网:HSN
2016/09/07 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
函授药学自我鉴定
2014/02/07 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
企业读书活动总结
2014/06/30 职场文书
自查自纠工作总结
2014/10/15 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
行政处罚告知书
2015/07/01 职场文书
Python实现日志实时监测的示例详解
2022/04/06 Python
hive数据仓库新增字段方法
2022/06/25 数据库