您好,登錄后才能下訂單哦!
這篇文章給大家介紹jquery項(xiàng)目中如何進(jìn)行防重復(fù)提交,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
在新項(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> <h2>This is index Page</h2> <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 = '<h2>hello jspang</h2>'; }) .get('/home', async (ctx, next) => { // ctx.body = '<h2>This is home Page</h2>' 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ò)。
關(guān)于jquery項(xiàng)目中如何進(jìn)行防重復(fù)提交就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。