如何防止AJAX请求每次触发两次?jQuery 3.3.1问题排查
解决jQuery AJAX请求重复发送的问题
嘿,我帮你分析下这个AJAX发两次请求的问题!你已经排除了事件重复绑定的可能,那咱们从代码里的几个细节入手:
可能的问题根源
同步请求(
async: false)的隐患
jQuery 3.3.1里的同步AJAX请求,在某些场景下会因为浏览器的线程阻塞机制,或者jQuery内部的错误重试逻辑,导致请求被重复发送。而且同步请求本身在现代浏览器里就有很多限制,官方也不推荐使用。请求头与数据格式不匹配
你设置了enctype: 'multipart/form-data',但同时又指定了dataType: "json"和mimeType: "application/json",而且直接传入了普通JS对象作为data。这种混合配置会让jQuery在处理请求时产生混淆——multipart/form-data是用于表单或文件上传的编码格式,而你要发送的是JSON数据,两者不匹配可能触发内部的异常处理,导致重复请求。
针对性解决方案
方案1:移除同步请求设置
把async: false删掉(jQuery默认就是异步请求,即async: true),同步请求是很多奇怪问题的诱因,尽量避免使用。
方案2:匹配请求格式与数据编码
如果你的后端接口接收JSON格式数据,调整请求配置如下:
- 移除
enctype: 'multipart/form-data' - 将
data转换为JSON字符串 - 设置
contentType: "application/json"(明确告诉服务器请求体是JSON)
修改后的代码示例:
$(function() { console.log("hi"); var request = {}; request["user_id"] = 1; request["date"] = new Date(); request["assignments"] = [{ "point_count" : 1, "skill_mnemo" : "SKILL_FARM" }]; $.ajax({ type: "POST", dataType: "json", contentType: "application/json", // 替换mimeType为contentType更合适 url: "./api/update_skill_point.php", data: JSON.stringify(request), // 转为JSON字符串 cache: false, success: function(result) { console.log(result); } }); });
方案3:检查全局AJAX配置
如果上面的修改还没解决问题,检查一下代码里有没有全局的$.ajaxSetup()配置,或者全局绑定的ajaxSend/ajaxBeforeSend事件,这些全局钩子可能会意外触发重复请求。
试一下这些修改,应该能解决请求重复发送的问题!
内容的提问来源于stack exchange,提问作者nortander
相关产品推荐
相关产品推荐

