jQuery如何防止Ajax重复提交


Posted in Javascript onOctober 14, 2016

首先说说防止重复点击提交是什么意思。

我们在访问有的网站,输入表单完成以后,单击提交按钮进行提交以后,提交按钮就会变为灰色,用户不能再单击第二次,直到重新加载页面或者跳转。这样,可以一定程度上防止用户重复提交导致应用程序上逻辑错误。

不妨引深来看,它不一定发生在表单的提交事件上,同样可以发生在ajax的异步请求上。有效地在web客户端采用一定机制去防止重复点击提交,将大大减轻服务器端压力。

下面看下代码关于jquery ajax防止重复提交。

**
* jquery ajax请求过滤,防止ajax请求重复发送,对ajax发送错误时进行统一处理
*/
$(function(){
var pendingRequests = {};
// 所有ajax请求的通用前置filter
$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
var key = generatePendingRequestKey(options);
//请求是否已经存在
if(!pendingRequests[key]){
storePendingRequest(key,jqXHR);
}else{
//如果ajax请求已经存在,下一次相同的请求则取消,防止重复请求
jqXHR.abort();
}
//ajax请求完成时,从临时对象中清除请求对应的数据
var complete = options.complete;
options.complete = function(jqXHR, textStatus) {
//延时1000毫秒删除请求信息,表示同Key值请求不能在此时间段内重复提交
setTimeout(function(){
delete pendingRequests[jqXHR.pendingRequestKey];
},1000);
if ($.isFunction(complete)) {
complete.apply(this, arguments);
}
};
//统一的错误处理
var error = options.error;
options.error = function(jqXHR, textStatus) {
errorHandler(jqXHR, textStatus);
if ($.isFunction(error)) {
error.apply(this, arguments);
}
};
});
/**
* 当ajax请求发生错误时,统一进行拦截处理的方法
*/
function errorHandler(jqXHR, textStatus){
switch (jqXHR.status){
case(500):
internalError(jqXHR);
break;
case(403):
accessDenied(jqXHR);
break;
case(408):
timeoutError(jqXHR);
break;
case(404):
pageNotFound(jqXHR);
break;
default:
//otherError(jqXHR, textStatus);
}
}
function pageNotFound(jqXHR){
Component.warningMessageBox({
content:"请求访问的地址或内容不存在!"
});
}
function accessDenied(jqXHR){
Component.warningMessageBox({
content:"你无权进行此操作或页面访问!"
});
}
function internalError(jqXHR){
Component.warningMessageBox({
content:"服务器存在错误,未能正确处理你的请求!"
});
}
function timeoutError(jqXHR){
window.location.href=contextPath + "/j_spring_security_logout";
}
function otherError(jqXHR, textStatus){
Component.warningMessageBox({
content:"未知错误,错误代码:" + textStatus
});
}
/**
* 将ajax请求存储到临时对象中,用于根据key判断请求是否已经存在
*/
function storePendingRequest(key, jqXHR){
pendingRequests[key] = jqXHR;
jqXHR.pendingRequestKey = key;
}
/**
* 根据ajax请求参数构建一个临时存储key,此处简单的使用url作为key,
* 不考虑为解决请求类型为get时相同路径引起的缓存问题,采用随机码构建URL的情况
*/
function generatePendingRequestKey(options){
return options.url;
}
});

以上所述是小编给大家介绍的jquery防止Ajax重复提交的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery中的$.getJSON 使用说明
Mar 10 Javascript
js实现广告漂浮效果的小例子
Jul 02 Javascript
推荐9款炫酷的基于jquery的页面特效
Dec 07 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 Javascript
学习使用bootstrap的modal和carousel
Dec 09 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
Jun 05 Javascript
Vue组件之Tooltip的示例代码
Oct 18 Javascript
vue-resource + json-server模拟数据的方法
Nov 02 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
Mar 08 Javascript
如何把vuejs打包出来的文件整合到springboot里
Jul 26 Javascript
vuex的module模块用法示例
Nov 12 Javascript
Jquery cookie插件实现原理代码解析
Aug 04 jQuery
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
javascript对浅拷贝和深拷贝的详解
Oct 14 #Javascript
You might like
dedecms模板标签代码官方参考
2007/03/17 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python3 Random模块代码详解
2017/12/04 Python
python编写分类决策树的代码
2017/12/21 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
Python中 map()函数的用法详解
2018/07/10 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
金融专业应届生求职信
2013/11/02 职场文书
中层干部岗位职责
2013/12/18 职场文书
社区务虚会发言材料
2014/10/20 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
大学毕业生自我评价
2015/03/02 职场文书