jQuery表单提交多重校验:首个校验失败如何终止后续校验逻辑
表单提交串行校验滚动异常修复
需求与原有实现
表单提交前需要完成两项规则校验:
- 通过
getElementById("title")获取标题输入值,校验内容长度合规性 - 通过
$("#filesTable_ tr.template-download").length统计已上传附件数量,校验附件数合规性
原有逻辑规则:校验不通过时调用e.preventDefault()阻止表单提交,以600ms动画时长滚动到对应错误元素位置(滚动偏移量-70px),之后展示错误提示。
原有实现代码如下:
$(document).ready(function(){ $('#form').submit(function(e) { if(document.getElementById("title").value.length < 2) { e.preventDefault(); $('html, body').animate({ scrollTop: $("input[name='rpagetitle']").offset().top-70 }, 600); //here I show an error notifications } if($("#filesTable_ tr.template-download").length < 1) { e.preventDefault(); $('html, body').animate({ scrollTop: $("#dropzone").offset().top-70 }, 600); //here I show an error notifications } { return true; } }); });
异常表现
当两项校验均不通过时,页面会连续触发两次滚动动画:先定位到标题输入框位置,随后立刻跳转定位到附件上传区(dropzone)位置,不符合交互预期。
预期校验规则
校验需要按优先级串行执行:
- 优先校验标题字段:若标题不符合要求,直接滚动到标题位置展示错误,终止后续所有校验逻辑
- 标题校验通过后,再校验附件数量:若附件数不符合要求,滚动到附件上传区展示错误,终止提交流程
- 两项校验全部通过时,正常放行表单提交
问题原因
原有代码的两个if判断为独立顺序执行逻辑,标题校验触发滚动后代码不会中断,会继续执行后续的附件校验逻辑,触发第二次滚动动画覆盖前一次的滚动效果,最终表现为直接跳转到附件区域。
修复方案
校验不通过触发错误提示后,直接return false终止后续逻辑执行,保证高优先级校验不通过时不会执行后续校验规则。修复后完整代码如下:
$(document).ready(function(){ $('#form').submit(function(e) { // 优先校验标题,增加trim处理避免纯空格输入绕过校验 const titleValue = document.getElementById("title").value.trim(); if(titleValue.length < 2) { e.preventDefault(); $('html, body').animate({ scrollTop: $("input[name='rpagetitle']").offset().top - 70 }, 600); // 展示标题错误提示 return false; // 终止后续所有逻辑 } // 标题校验通过后再校验附件数量 const uploadedFileCount = $("#filesTable_ tr.template-download").length; if(uploadedFileCount < 1) { e.preventDefault(); $('html, body').animate({ scrollTop: $("#dropzone").offset().top - 70 }, 600); // 展示附件错误提示 return false; // 终止后续所有逻辑 } // 全部校验通过,正常提交表单 return true; }); });
内容的提问来源于stack exchange,提问作者Andrew Zheludkov
相关产品推荐
相关产品推荐

