经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » jQuery » 查看文章
jquery项目中如何防重复提交详解
来源:jb51  时间:2021/11/8 13:30:43  对本文有异议

在新项目中,axios能实现防重复提交的功能,不过老项目(例如jQuery)的项目中,没有axios。但是导入Ajax-hook
就可以实现

Ajax-hook源码地址 : https://github.com/wendux/Ajax-hook

导入

  1. <script src="https://unpkg.com/ajax-hook@2.0.3/dist/ajaxhook.min.js"></script>

ah对象是在导入ajaxhook.min.js后就会出现的,使用:

  1. ah.proxy({
  2. //请求发起前进入
  3. onRequest: (config, handler) => {
  4. console.log(config.url)
  5. handler.next(config);
  6. },
  7. //请求发生错误时进入,比如超时;注意,不包括http状态码错误,如404仍然会认为请求成功
  8. onError: (err, handler) => {
  9. console.log(err.type)
  10. handler.next(err)
  11. },
  12. //请求成功后进入
  13. onResponse: (response, handler) => {
  14. console.log(response.response)
  15. handler.next(response)
  16. }
  17. })

其中,config.method为ajax请求的方式(GET/POST),config.url为请求的路径。onError中的err对象和onResponse中的response可以通过err.config.method/response.config.method来获得ajax的请求方式。

我稍微封装了一下,实现防重复提交的js文件,亲测有效,朋友们可以后再测试一下,欢迎各路大神谈论和指出不足。

  1. ```javascript
  2. function laodJS(url, callback) {
  3. var script = document.createElement('script');
  4. fn = callback || function() {};
  5. script.type = 'text/javascript';
  6. script.defer = true;
  7. // IE
  8. if (script.readyState) {
  9. script.onreadystatechange = function() {
  10. if (script.readyState == 'loaded' || script.readyState == 'complete') {
  11. script.onreadystatechange = null;
  12. fn();
  13. }
  14. }
  15. } else {
  16. // 其他浏览器
  17. script.onload = function() {
  18. fn();
  19. }
  20. }
  21. script.src = url;
  22. document.getElementsByTagName('body')[0].appendChild(script);
  23. }
  24. laodJS('https://unpkg.com/ajax-hook@2.0.3/dist/ajaxhook.min.js', function() {
  25. let ajaxArr = []
  26. ah.proxy({
  27. //请求发起前进入
  28. onRequest: (config, handler) => {
  29. var id = config.method + config.url
  30. if (ajaxArr.indexOf(id) === -1) {
  31. // 给每个请求设置唯一ID,push到ajaxArr里。在请求完成时再移除那个项
  32. ajaxArr.push(id)
  33. handler.next(config);
  34. } else {
  35. return handler.reject()
  36. }
  37. },
  38. //请求发生错误时进入,比如超时;注意,不包括http状态码错误,如404仍然会认为请求成功
  39. onError: (err, handler) => {
  40. var id = err.config.method + err.config.url
  41. if (ajaxArr.indexOf(id) !== -1) {
  42. ajaxArr.splice(ajaxArr.indexOf(id), 1)
  43. }
  44. handler.next(err)
  45. },
  46. //请求成功后进入
  47. onResponse: (response, handler) => {
  48. var id = response.config.method + response.config.url
  49. if (ajaxArr.indexOf(id) !== -1) {
  50. ajaxArr.splice(ajaxArr.indexOf(id), 1)
  51. }
  52. handler.next(response)
  53. }
  54. })
  55. })

直接在全局中引入这个文件就可以了,我这个文件命名为preventRepeatSubmission.js。

我的HTML代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <h1>This is index Page</h1>
  9. <ul>
  10. <li><a href="/">/</a></li>
  11. <li><a href="/index">index页面</a></li>
  12. <li><a href="/404">404页面</a></li>
  13. <li><a href="/info">info页面</a></li>
  14. <li><a href="/nofound">nofound</a></li>
  15. </ul>
  16. <button id="sendMsg">请求拦截器</button>
  17. <script src="./jquery.min.js"></script>
  18. <!-- <script src="https://unpkg.com/ajax-hook@2.0.3/dist/ajaxhook.min.js"></script> -->
  19. <script src="./preventRepeatSubmission.js"></script>
  20. <script>
  21. document.getElementById("sendMsg").addEventListener("click", function() {
  22. $.ajax({
  23. url: 'http://localhost:3000/home',
  24. type: 'GET',
  25. success: function(data) {
  26. console.log('success', data)
  27. }
  28. })
  29. })
  30. </script>
  31. </body>
  32. </html>

我的服务器使用koa2搭建的,代码如下:

  1. const Koa = require('koa');
  2. const Router = require('koa-router');
  3.  
  4. const app = new Koa();
  5. const router = new Router();
  6.  
  7. router
  8. .get('/', (ctx, next) => {
  9. ctx.body = '<h1>hello jspang</h1>';
  10. })
  11. .get('/home', async (ctx, next) => {
  12. // ctx.body = '<h1>This is home Page</h1>'
  13. async function delay(time) {
  14. return new Promise(function(resolve, reject) {
  15. setTimeout(function(){
  16. resolve();
  17. }, time);
  18. });
  19. };
  20. await delay(5000);
  21. const url = ctx.url;
  22. // 在request中获取get请求参数
  23. const request = ctx.request;
  24. const request_query = request.query;
  25. const request_querystring = request.querystring;
  26.  
  27. // 在ctx中获取get请求的参数
  28. const ctx_query = ctx.query;
  29. const ctx_querystring = ctx.querystring;
  30. ctx.body = {url, request_query, request_querystring, ctx_query, ctx_querystring};
  31. ctx.response.body = {status:200, msg:'已经成功获得参数'};
  32. })
  33.  
  34. app
  35. .use(router.routes()) // 向app中装载路由
  36. .use(router.allowedMethods()) // 装载中间件
  37.  
  38. app.listen(3000, () => {
  39. console.log('[Demo] is running at port 3000');
  40. });

浏览器测试效果:

按下图中的button就会发起一次ajax请求,我的服务器是延迟响应5s的,在这延迟5s期间,我有点击了20次button,发起相同的20次ajax被成功拦截了,效果不错。

总结

到此这篇关于jquery项目中如何防重复提交的文章就介绍到这了,更多相关jquery防重复提交内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号