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注册协议倒计时的小例子
Jun 24 Javascript
JS文本获得焦点清除文本文字的示例代码
Jan 13 Javascript
jQuery定义背景动态切换效果的方法
Mar 23 Javascript
JavaScript判断是否是微信浏览器
Jun 13 Javascript
文件上传,iframe跨域数据提交的实现
Nov 18 Javascript
详解js中Json的语法与格式
Nov 22 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
Mar 09 Javascript
VUE element-ui 写个复用Table组件的示例代码
Nov 18 Javascript
vue.js响应式原理解析与实现
Jun 22 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
Vue3.0结合bootstrap创建多页面应用
May 28 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
坏狼php学习 计数器实例代码
2008/06/15 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
Codeigniter检测表单post数据的方法
2015/03/21 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
Python zip函数打包元素实例解析
2019/12/11 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
HTML5 Canvas之测试浏览器是否支持Canvas的方法
2015/01/01 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
二手车转让协议书
2015/01/29 职场文书
中标通知书格式
2015/04/17 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL