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 相关文章推荐
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
Aug 02 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
Dec 10 Javascript
js原型继承的两种方法对比介绍
Mar 30 Javascript
JavaScript设置表单上传时文件个数的方法
Aug 11 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
Feb 13 Javascript
vue+element-ui动态生成多级表头的方法
Aug 28 Javascript
Vue 动态添加路由及生成菜单的方法示例
Jun 20 Javascript
vue中axios的二次封装实例讲解
Oct 14 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
js实现翻牌小游戏
Jul 31 Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 Javascript
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
论坛头像随机变换代码
2006/10/09 PHP
在字符串中把网址改成超级链接
2006/10/09 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
刷新时清空文本框内容的js代码
2007/04/23 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
python requests指定出口ip的例子
2019/07/25 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
社区娱乐活动方案
2014/08/21 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android