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 相关文章推荐
动态加载js的方法汇总
Feb 13 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
Mar 26 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
Aug 12 Javascript
javascript事件绑定学习要点
Mar 09 Javascript
微信小程序 自定义对话框实例详解
Jan 20 Javascript
微信小程序Redux绑定实例详解
Jun 07 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
JS判断数组里是否有重复元素的方法小结
May 21 Javascript
vue-quill-editor的使用及个性化定制操作
Aug 04 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 21 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
Oct 24 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
javascript对浅拷贝和深拷贝的详解
Oct 14 #Javascript
You might like
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
php入门教程 精简版
2009/12/13 PHP
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
js如何验证密码强度
2020/03/18 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
python 排序算法总结及实例详解
2016/09/28 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
python 字典套字典或列表的示例
2019/12/16 Python
python读写文件write和flush的实现方式
2020/02/21 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
暑期社会实践方案
2014/02/05 职场文书
法律专业学生的自我评价
2014/02/07 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
节水标语大全
2014/06/11 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
行政前台岗位职责
2015/04/16 职场文书
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL