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修改css样式style
Apr 15 Javascript
js实现快速分享功能(你的文章分享工具)
Jun 25 Javascript
浅析JavaScript中的常用算法与函数
Nov 21 Javascript
使用Node.js处理前端代码文件的编码问题
Feb 16 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
Sep 18 Javascript
Vue中的Props(不可变状态)
Sep 29 Javascript
webpack4.x CommonJS模块化浅析
Nov 09 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
详解如何在Vue项目中导出Excel
Apr 19 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
Jul 26 Javascript
详解Vue中的watch和computed
Nov 09 Javascript
JavaScript 中for/of,for/in 的详细介绍
Nov 17 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
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
介绍一些PHP判断变量的函数
2012/04/24 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
php curl的深入解析
2013/06/02 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
php封装的验证码类分享
2017/02/26 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
JavaScript URL参数读取改进版
2009/01/16 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
JS创建Tag标签的方法详解
2017/06/09 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
python实现二叉查找树实例代码
2018/02/08 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
django实现日志按日期分割
2020/05/21 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
护士见习期自我鉴定
2014/02/08 职场文书
美术指导求职信
2014/03/17 职场文书
护理专科学生自荐书
2014/07/05 职场文书
部队个人年终总结
2015/03/02 职场文书
贷款工资证明范本
2015/06/12 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers