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 相关文章推荐
JavaScript 格式字符串的应用
Mar 29 Javascript
jquery 学习之二 属性相关
Nov 23 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
Apr 17 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
简单实现JS对dom操作封装
Dec 02 Javascript
JQUERY表单暂存功能插件分享
Feb 23 Javascript
Bootstrap select实现下拉框多选效果
Dec 23 Javascript
js return返回多个值,通过对象的属性访问方法
Feb 21 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
Apr 22 Javascript
浅谈Angular 观察者模式理解
Nov 01 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
Sep 26 Javascript
Javascript call及apply应用场景及实例
Aug 26 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
php计算税后工资的方法
2015/07/28 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
js常用函数 不错
2006/09/08 Javascript
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
python使用win32com库播放mp3文件的方法
2015/05/30 Python
详解Python的Lambda函数与排序
2016/10/25 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
python自动发微信监控报警
2019/09/06 Python
基于Django统计博客文章阅读量
2019/10/29 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
python怎么判断素数
2020/07/01 Python
Python实现随机爬山算法
2021/01/29 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
办公室副主任职责范本
2014/03/08 职场文书
学习之星事迹材料
2014/05/17 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书