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 相关文章推荐
jquery中常用的函数和属性详细解析
Mar 07 Javascript
jquery中map函数与each函数的区别实例介绍
Jun 23 Javascript
js实现的简单radio背景颜色选择器代码
Aug 18 Javascript
js编写一个简单的产品放大效果代码
Jun 27 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
Jul 21 Javascript
AngularJs Scope详解及示例代码
Sep 01 Javascript
jQuery实现的网页换肤效果示例
Sep 20 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
Feb 14 Javascript
在vue-cli中组件通信的方法
Dec 16 Javascript
Vue组件实现触底判断
Jun 26 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
Sep 03 Javascript
jQuery实时统计输入框字数及限制
Jun 24 jQuery
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运行模式的深入理解
2013/06/03 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
jQuery 创建Dom元素
2010/05/07 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
js获取页面description的方法
2015/05/21 Javascript
简介alert()与console.log()的不同
2015/08/26 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
python 基础教程之Map使用方法
2017/01/17 Python
python rsa 加密解密
2017/03/20 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
通过代码实例了解Python sys模块
2020/09/14 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
介绍一下Linux中的链接
2016/05/28 面试题
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android