jquery項(xiàng)目中如何防重復(fù)提交詳解
在新項(xiàng)目中,axios能實(shí)現(xiàn)防重復(fù)提交的功能,不過(guò)老項(xiàng)目(例如jQuery)的項(xiàng)目中,沒(méi)有axios。但是導(dǎo)入Ajax-hook
就可以實(shí)現(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對(duì)象是在導(dǎo)入ajaxhook.min.js后就會(huì)出現(xiàn)的,使用:
ah.proxy({ //請(qǐng)求發(fā)起前進(jìn)入 onRequest: (config, handler) => { console.log(config.url) handler.next(config); }, //請(qǐng)求發(fā)生錯(cuò)誤時(shí)進(jìn)入,比如超時(shí);注意,不包括http狀態(tài)碼錯(cuò)誤,如404仍然會(huì)認(rèn)為請(qǐng)求成功 onError: (err, handler) => { console.log(err.type) handler.next(err) }, //請(qǐng)求成功后進(jìn)入 onResponse: (response, handler) => { console.log(response.response) handler.next(response) } })
其中,config.method為ajax請(qǐng)求的方式(GET/POST),config.url為請(qǐng)求的路徑。onError中的err對(duì)象和onResponse中的response可以通過(guò)err.config.method/response.config.method來(lái)獲得ajax的請(qǐng)求方式。
我稍微封裝了一下,實(shí)現(xiàn)防重復(fù)提交的js文件,親測(cè)有效,朋友們可以后再測(cè)試一下,歡迎各路大神談?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({ //請(qǐng)求發(fā)起前進(jìn)入 onRequest: (config, handler) => { var id = config.method + config.url if (ajaxArr.indexOf(id) === -1) { // 給每個(gè)請(qǐng)求設(shè)置唯一ID,push到ajaxArr里。在請(qǐng)求完成時(shí)再移除那個(gè)項(xiàng) ajaxArr.push(id) handler.next(config); } else { return handler.reject() } }, //請(qǐng)求發(fā)生錯(cuò)誤時(shí)進(jìn)入,比如超時(shí);注意,不包括http狀態(tài)碼錯(cuò)誤,如404仍然會(huì)認(rèn)為請(qǐng)求成功 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) }, //請(qǐng)求成功后進(jìn)入 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) } }) })
直接在全局中引入這個(gè)文件就可以了,我這個(gè)文件命名為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頁(yè)面</a></li> <li><a href="/404">404頁(yè)面</a></li> <li><a href="/info">info頁(yè)面</a></li> <li><a href="/nofound">nofound</a></li> </ul> <button id="sendMsg">請(qǐng)求攔截器</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請(qǐng)求參數(shù) const request = ctx.request; const request_query = request.query; const request_querystring = request.querystring; // 在ctx中獲取get請(qǐng)求的參數(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'); });
瀏覽器測(cè)試效果:
按下圖中的button就會(huì)發(fā)起一次ajax請(qǐng)求,我的服務(wù)器是延遲響應(yīng)5s的,在這延遲5s期間,我有點(diǎn)擊了20次button,發(fā)起相同的20次ajax被成功攔截了,效果不錯(cuò)。
總結(jié)
到此這篇關(guān)于jquery項(xiàng)目中如何防重復(fù)提交的文章就介紹到這了,更多相關(guān)jquery防重復(fù)提交內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
easyui導(dǎo)出excel無(wú)法彈出下載框的快速解決方法
下面小編就為大家?guī)?lái)一篇easyui導(dǎo)出excel無(wú)法彈出下載框的快速解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11JQuery實(shí)現(xiàn)簡(jiǎn)單的圖片滑動(dòng)切換特效
基于jQuery的一款圖片展示特效代碼,鼠標(biāo)移到圖片上方懸停時(shí)會(huì)自動(dòng)切換成文字簡(jiǎn)單顯示,適合做圖片集展示,推薦給大家。2015-11-11在jQuery中 關(guān)于json空對(duì)象篩選替換
本篇文章,小編將為大家介紹,在jQuery中 關(guān)于json空對(duì)象篩選替換,有需要的朋友可以參考一下2013-04-04JQuery 實(shí)現(xiàn)的頁(yè)面滾動(dòng)時(shí)浮動(dòng)窗口控件
JQuery 實(shí)現(xiàn)的頁(yè)面滾動(dòng)時(shí)浮動(dòng)窗口控件實(shí)現(xiàn)代碼,大家可以參考下。2009-07-07基于jQuery實(shí)現(xiàn)點(diǎn)擊彈出層實(shí)例代碼
基于jquery實(shí)現(xiàn)點(diǎn)擊鏈接彈出層效果,其基本實(shí)現(xiàn)原理是這樣的:jquery操作DOM元素。對(duì)層樣式的設(shè)置。將display:設(shè)置為none;讓層隱藏;對(duì)jq點(diǎn)擊彈出層相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01Web開(kāi)發(fā)者必備的12款超贊jQuery插件
jQuery插件能夠增強(qiáng)網(wǎng)站的可用性,有效地改善用戶體驗(yàn),還可以大大減少創(chuàng)建一個(gè)新站點(diǎn)的開(kāi)發(fā)時(shí)間。2010-12-12jquery實(shí)現(xiàn)簡(jiǎn)易的移動(dòng)端驗(yàn)證表單
本文給大家匯總介紹了幾個(gè)常用的jquery實(shí)現(xiàn)簡(jiǎn)易的移動(dòng)端驗(yàn)證表單,非常的實(shí)用,有需要的小伙伴可以進(jìn)來(lái)參考下。2015-11-11