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 判断undefined的实现代码
Nov 26 Javascript
jquery slibings选取同级其他元素的实现代码
Nov 15 Javascript
JavaScript运动减速效果实例分析
Aug 04 Javascript
JavaScript中定义类的方式详解
Jan 07 Javascript
灵活的理解JavaScript中的this指向
Feb 25 Javascript
JS验证图片格式和大小并预览的简单实例
Oct 11 Javascript
微信小程序实现给循环列表添加点击样式实例
Apr 26 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
Jun 26 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
Sep 21 Javascript
微信小程序分包加载代码实现方法详解
Sep 23 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
Jul 24 Javascript
Vue如何清空对象
Mar 03 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
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
浅谈PHP的反射机制
2016/12/15 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
python实现textrank关键词提取
2018/06/22 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
Python字典实现伪切片功能
2020/10/28 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
离婚财产分隔协议书
2014/10/23 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Python实现简单的俄罗斯方块游戏
2021/09/25 Python