一次点击事件,触发两次异步请求

本文探讨了一次点击事件触发两次相同异步请求的问题,并详细介绍了如何通过使用stopImmediatePropagation()来避免数据库中出现重复记录的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一次点击事件,触发两次异步请求,导致数据库存入了相同的两条记录

起因:在异步请求中,点击事件点击一次,结果触发了两次相同的异步请求,数据库也存入了两条相同记录

百度:首先是阻止事件冒泡: event.preventDefault(); 无效

          其次,因为元素是动态生成的,所以点击事件运用了JQuery里面的on()方法,绑定在body上面;就百度了

         博客利用on和off方法编写高效的js代码知道了很多在dom对象删除以后,其声明的绑定在window上的事件还一直存      在,导致相同的功能代码执行了几次。故使用之前要清理掉body上绑定的click事件,利用了jQuery里面off()方法。$('body').off('click').on('click','selector',function(){});       无效

      最后  利用 stopImmediatePropagation()  成功解决

需要弄清楚的知识点是事件冒泡和事件捕获;

以下为百度到的参考笔记:
事件冒泡:

在 Python Flask 中,如果你想要在一个表单提交(如 POST 请求)之后触发两次渲染,通常的做法不是直接在同一个路由下完成,因为同一个请求只会响应一次。你可以考虑以下两种策略: 1. **利用前端技术**: - 在前端,当用户点击提交按钮后,发送两次 AJAX 请求,分别针对两个不同的 URL 或同一路由的不同处理器。这样可以在服务器端分别处理这两个请求并渲染两次页面。 ```javascript // 示例:使用jQuery $(document).ready(function() { $('#my-form').on('submit', function(e) { e.preventDefault(); // 阻止默认提交 $.ajax({ url: '/recommend/first', type: 'POST', data: $(this).serialize(), success: function(data) { // 渲染第一次页面 renderFirstPage(data); } }); // 发送第二个请求 $.ajax({ url: '/recommend/second', type: 'POST', data: $(this).serialize(), success: function(data) { // 渲染第二次页面 renderSecondPage(data); } }); }); }); ``` 在这个例子中,`/recommend/first` 和 `/recommend/second` 是两个不同的Flask路由,它们可能会调用不同的视图函数分别处理数据。 2. **后端异步处理**: - 如果你想让后端在一次提交后异步处理数据,可以考虑使用Flask的Celery或其他任务队列库来延迟执行后续操作。首先保存用户的数据,然后创建一个任务处理这个数据,完成后更新视图并渲染页面。 ```python from flask import current_app from celery import Celery celery_app = Celery(__name__, broker=current_app.config['CELERY_BROKER_URL']) @celery_app.task def process_data_and_render(data): # 处理数据... result = some_processing(data) render_second_view(result) # 原始POST视图 @app.route('/recommend', methods=['POST']) def handle_post(): # 保存数据到数据库 save_data_to_db(request.data) # 异步处理 process_data_and_render.delay(request.data) return "Data saved and processing started." # 视图处理结果并渲染页面 @app.route('/process_result', methods=['GET']) def process_result_view(): data = get_data_from_database() return render_template('second_page.html', data=data) ``` 在这段代码里,`handle_post` 视图会保存数据并启动任务,`process_result_view` 会在数据处理完成后渲染页面。 这两种方案都能满足你的需求,具体选择哪种取决于你的应用架构和性能要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值