jquery項目中如何防重復(fù)提交詳解
在新項目中,axios能實現(xiàn)防重復(fù)提交的功能,不過老項目(例如jQuery)的項目中,沒有axios。但是導(dǎo)入Ajax-hook
就可以實現(xiàn)
Ajax-hook源碼地址 : https://github.com/wendux/Ajax-hook
導(dǎo)入
<script src="https://unpkg.com/ajax-hook@2.0.3/dist/ajaxhook.min.js"></script>
ah對象是在導(dǎo)入ajaxhook.min.js后就會出現(xiàn)的,使用:
ah.proxy({
//請求發(fā)起前進入
onRequest: (config, handler) => {
console.log(config.url)
handler.next(config);
},
//請求發(fā)生錯誤時進入,比如超時;注意,不包括http狀態(tài)碼錯誤,如404仍然會認(rèn)為請求成功
onError: (err, handler) => {
console.log(err.type)
handler.next(err)
},
//請求成功后進入
onResponse: (response, handler) => {
console.log(response.response)
handler.next(response)
}
})
其中,config.method為ajax請求的方式(GET/POST),config.url為請求的路徑。onError中的err對象和onResponse中的response可以通過err.config.method/response.config.method來獲得ajax的請求方式。
我稍微封裝了一下,實現(xiàn)防重復(fù)提交的js文件,親測有效,朋友們可以后再測試一下,歡迎各路大神談?wù)摵椭赋霾蛔恪?/p>
```javascript
function laodJS(url, callback) {
var script = document.createElement('script');
fn = callback || function() {};
script.type = 'text/javascript';
script.defer = true;
// IE
if (script.readyState) {
script.onreadystatechange = function() {
if (script.readyState == 'loaded' || script.readyState == 'complete') {
script.onreadystatechange = null;
fn();
}
}
} else {
// 其他瀏覽器
script.onload = function() {
fn();
}
}
script.src = url;
document.getElementsByTagName('body')[0].appendChild(script);
}
laodJS('https://unpkg.com/ajax-hook@2.0.3/dist/ajaxhook.min.js', function() {
let ajaxArr = []
ah.proxy({
//請求發(fā)起前進入
onRequest: (config, handler) => {
var id = config.method + config.url
if (ajaxArr.indexOf(id) === -1) {
// 給每個請求設(shè)置唯一ID,push到ajaxArr里。在請求完成時再移除那個項
ajaxArr.push(id)
handler.next(config);
} else {
return handler.reject()
}
},
//請求發(fā)生錯誤時進入,比如超時;注意,不包括http狀態(tài)碼錯誤,如404仍然會認(rèn)為請求成功
onError: (err, handler) => {
var id = err.config.method + err.config.url
if (ajaxArr.indexOf(id) !== -1) {
ajaxArr.splice(ajaxArr.indexOf(id), 1)
}
handler.next(err)
},
//請求成功后進入
onResponse: (response, handler) => {
var id = response.config.method + response.config.url
if (ajaxArr.indexOf(id) !== -1) {
ajaxArr.splice(ajaxArr.indexOf(id), 1)
}
handler.next(response)
}
})
})
直接在全局中引入這個文件就可以了,我這個文件命名為preventRepeatSubmission.js。
我的HTML代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>This is index Page</h1>
<ul>
<li><a href="/">/</a></li>
<li><a href="/index">index頁面</a></li>
<li><a href="/404">404頁面</a></li>
<li><a href="/info">info頁面</a></li>
<li><a href="/nofound">nofound</a></li>
</ul>
<button id="sendMsg">請求攔截器</button>
<script src="./jquery.min.js"></script>
<!-- <script src="https://unpkg.com/ajax-hook@2.0.3/dist/ajaxhook.min.js"></script> -->
<script src="./preventRepeatSubmission.js"></script>
<script>
document.getElementById("sendMsg").addEventListener("click", function() {
$.ajax({
url: 'http://localhost:3000/home',
type: 'GET',
success: function(data) {
console.log('success', data)
}
})
})
</script>
</body>
</html>
我的服務(wù)器使用koa2搭建的,代碼如下:
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
router
.get('/', (ctx, next) => {
ctx.body = '<h1>hello jspang</h1>';
})
.get('/home', async (ctx, next) => {
// ctx.body = '<h1>This is home Page</h1>'
async function delay(time) {
return new Promise(function(resolve, reject) {
setTimeout(function(){
resolve();
}, time);
});
};
await delay(5000);
const url = ctx.url;
// 在request中獲取get請求參數(shù)
const request = ctx.request;
const request_query = request.query;
const request_querystring = request.querystring;
// 在ctx中獲取get請求的參數(shù)
const ctx_query = ctx.query;
const ctx_querystring = ctx.querystring;
ctx.body = {url, request_query, request_querystring, ctx_query, ctx_querystring};
ctx.response.body = {status:200, msg:'已經(jīng)成功獲得參數(shù)'};
})
app
.use(router.routes()) // 向app中裝載路由
.use(router.allowedMethods()) // 裝載中間件
app.listen(3000, () => {
console.log('[Demo] is running at port 3000');
});
瀏覽器測試效果:

按下圖中的button就會發(fā)起一次ajax請求,我的服務(wù)器是延遲響應(yīng)5s的,在這延遲5s期間,我有點擊了20次button,發(fā)起相同的20次ajax被成功攔截了,效果不錯。
總結(jié)
到此這篇關(guān)于jquery項目中如何防重復(fù)提交的文章就介紹到這了,更多相關(guān)jquery防重復(fù)提交內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
easyui導(dǎo)出excel無法彈出下載框的快速解決方法
下面小編就為大家?guī)硪黄猠asyui導(dǎo)出excel無法彈出下載框的快速解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11

