表单重复提交问题的三种解决思路
前端开发中接触的表单提交还是很多的,有时候如果不对提交事件进行处理的话会遇到重复多次提交。
最近开发遇到一个问题,找了挺久才找到原因解决-_-||,表单一直提交两次,以为是双击重复提交了,就在提交之后禁用提交按钮了,but...
再试还是提交了两次,结果是label包裹input,点击label提交的时候提交两次,然后处理完这个,表单只提交是一次了正常的,但是最后一个选项没有正确的提交进去,,,最后在提交的时候加一个setTimeout(),终于解决问题
经过这次,总结出几条表单重复提交问题查找方向,主要从几个方面来考虑:
第一:如果是点击submit类型的按钮提交表单,就要先看是否是表单的默认提交事件,如果是,禁用默认提交事件(event.preventDefault();)或者改用button类型按钮提交
$('#submit').click(function(e){ e.preventDefault() })
第二: 如果是点击按钮ajax提交,就要在提交之后禁用掉按钮,以免重复提交,这个在平时各种情况下的表单提交都考虑进去
禁用按钮,加disabled属性,或者加pointer-event:none属性,或者用一个count来计数,只有在点击一次的时候才提交表单
通常在提交成功之后会刷新或跳转页面,失败则不会,要注意一下,如果提交失败,把禁用的按钮解除禁用
let count = 0; $('#submit').click(function(){ count++; if (page.clicktime == 1) { setTimeout(()=>{ $.ajax({ success:res=>{ if(!res.success){ count = 0 // 提交按钮解除禁用 } }, error:err=>{ count = 0 // 提交按钮解除禁用 } }) }) } // $(this).attr('disabled,true) // 禁用按钮or // $(this).css('pointer-event','none') // 来禁用点击事件 })
第三: 如果是点击选项提交,那么就要考虑label和input的关联问题了,点击label, 事件冒泡,input也会触发一次提交
可以这样来处理
$('label').click(function(e) { if($(e.target).is('input')){ // 点击label的时候,如果事件源是input,那么就把它禁用掉 return; } });
最后,其他的点击事件也可以这样处理, 避免多次触发事件
var isclick = true $('#id').click(function(){ if(isclick){ isclick = false; // 如果双击不想触发两次点击事件,可以在这里加一个禁用点击事件 $(this).css('pointer-event','none') // do something setTimeout(()=>{ // 在这里过段时间再释放使得可以再次触发点击事件 $(this).css('pointer-event','none') isclick = true }) } })
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误