jQuery Validation Plugin 1.19.5 实战:从基础规则到动态表单验证
2026/9/20 12:13:38 网站建设 项目流程

简介:jQuery Validation Plugin 1.19.5 是 jQuery 生态中成熟稳定的表单验证插件,面向 Web 前端开发者,用来解决表单提交前的数据校验问题,减少因用户输入错误带来的无效请求,对于需要在前端实现即时校验的场景尤其适用。该插件既适合从零搭建的轻量项目,也能与遗留系统中大量现有标记和谐共存;内置对 URL、电子邮箱等常见格式的验证,同时开放 API 允许自定义校验规则,这一版本还修复了 CVE-2021-21252 漏洞,能够避免相关安全风险,整体安全性有所增强。压缩包共有 4 个 JS 文件,包含核心验证库和附加方法库,且每种库都区分正常版与压缩版,既方便开发时阅读源码,也便于生产环境直接引用,整体大小只有 42KB,对页面加载影响极小。目前已有 652 人学习下载。借助它,开发者可以获得开箱即用且经过安全加固的表单验证方案,配合 additional-methods 补充的多种校验方法,能够覆盖更多真实业务场景,显著降低手动校验逻辑的编写与维护成本,提升前端开发效率与交付质量。 老项目还在用 jQuery,表单验证却又不想手写一堆正则和事件绑定,那 jQuery Validation Plugin 基本就是绕不开的选择。1.19.5 这个版本,我看了下发布时间,算是这个插件在 jQuery 生态里的最新稳定版,修复了不少老版本遗留的边缘问题,对还在维护中后台项目的团队来说,值得专门升一下。写这篇东西,主要想把这几年用这个插件的经验梳理一遍,从怎么引入、怎么配规则,到 remote 异步验证、动态表单处理,再到实际项目中一定会踩的那些坑,一次性说清楚。

我能用到这个插件的场景太常见了:登录注册、订单提交、后台表单、弹窗里的表单校验……凡是涉及输入的地方,都需要一套统一、可维护的验证方案。相比自己写 onblur、onsubmit 那一堆监听,插件的方式更规整,也更好复用。这篇适合正在做老项目维护、或者准备从零快速实现一套能落地的前端校验逻辑的开发者,新手可以照着抄,老人也可以看看有没有漏掉什么细节。

1. 先搞明白 1.19.5 你要怎么拿到手

1.1 官方下载与本地引入

很多人在第一步就被坑住了。搜索引擎一搜,把 jQuery Validation Plugin 官方仓库里那一堆文件拿下来,结果发现引入后控制台直接报错,验证规则怎么都不生效。这里先说清楚,你真正需要的是jquery.validate.js(开发版)和jquery.validate.min.js(压缩版),另外一个additional-methods.js也建议一起拿下来,里面包含了很多内置但默认不加载的验证规则,比如手机号、URL、日期等。

在 1.19.5 版本中,插件的核心文件对 jQuery 的最低版本要求是 1.7.2,但实际项目里我建议至少用 jQuery 1.12.4 以上的版本,倒不是说跑不起来,而是插件内部对一些老 API 的兼容分支已经不怎么维护了,用新一点的版本更能避开一些莫名其妙的 bug。引入顺序也很关键,必须先把 jQuery 加载出来,再加载 validate,否则插件找不到 jQuery 基础对象,肯定报$.validator is undefined这类错误。

1.2 三种引入方式对比

至于怎么把文件弄到项目里,一般有三种方式,我分别说下优缺点:

引入方式操作难度适用场景注意事项
直接本地文件最简单传统后端渲染页面、CDN 不稳定的内网环境下载文件时注意 js 文件版本一致,不要 mix 混用
CDN 引入极简快速 demo、公网部署的普通站点1.19.5 版本在生产环境建议锁版本号,避免缓存问题
npm/构建工具稍复杂Webpack/Vite 工程化项目需要import 'jquery-validation',并且注意引入顺序

如果你用的是 CDN,官方推荐的 jsdelivr 地址是https://cdn.jsdelivr.net/npm/jquery-validation@1.19.5/dist/jquery.validate.min.js,稳定且支持版本锁定。如果是下载本地文件,记得从 GitHub Releases 页面拿 1.19.5 的 tag 包,别在 master 分支上随便点一个下载,那个可能不是稳定版。

2. 五分钟跑通一个能用的验证流程

2.1 基本初始化和规则

先来看一段最基础的使用方式,这段代码我几乎是复制粘贴到每个项目里的,只是在表单字段上做调整。

<form id="myForm"> <input type="text" name="username" id="username"> <input type="password" name="password" id="password"> <input type="email" name="email" id="email"> <button type="submit">提交</button> </form>
$(function () { $("#myForm").validate({ rules: { username: { required: true, minlength: 3 }, password: { required: true, minlength: 6 }, email: { required: true, email: true } }, messages: { username: { required: "请输入用户名", minlength: "用户名至少3个字符" }, password: { required: "请输入密码", minlength: "密码至少6个字符" }, email: { required: "请输入邮箱", email: "请输入正确的邮箱格式" } } }); });

这个插件的核心逻辑很简单,它通过表单元素的name属性来关联验证规则,而不是id。这一点非常关键,因为很多人一开始用id去配 rules,结果完全不生效。插件初始化时会对整个表单做一次扫描,然后自动绑定submitblur事件,不需要你手动去触发校验。

这个例子里我用了三种规则:required判断非空,minlength判断最短长度,email判断格式。这里面email是插件内置的正则匹配,不需要你自己去写复杂的正则。

2.2 内置规则清单

1.19.5 版本内置的规则已经覆盖了绝大多数业务场景,我把常用的列一下:

规则作用示例参数说明
required必填true也可传依赖表达式,如"#otherField:filled"
remote远程校验请求地址常用在用户名是否重复、邮箱是否注册
minlength最小长度6按字符数计算
maxlength最大长度20按字符数计算
rangelength长度范围[6, 20]限制输入长度在6到20之间
min最小值1适用于数字输入
max最大值100适用于数字输入
range数字范围[1, 100]必须为数字
email邮箱格式true内置正则校验
urlURL格式true需以 http/https 开头可留空
date日期格式true默认按 ISO 格式
equalTo与另一字段相同"#password"常用于确认密码
pattern自定义正则正则字符串独立于 additional-methods 之外更方便

实际项目里最简单的用法,是把这些规则塞进rules对象,由插件统一管理。这样 UI、交互、规则都集中在一个配置里,比每个输入框单独写监听清爽太多。

3. 进阶:企业级表单验证的几个核心动作

3.1 remote 远程验证怎么用

业务里最刚需的是“远程验证”,典型场景:注册时校验用户名是否被占用。1.19.5 的remote规则可以非常优雅地解决。

rules: { username: { required: true, minlength: 3, remote: { url: "/api/user/checkUsername", type: "post", data: { username: function () { return $("#username").val(); } } } } }, messages: { username: { remote: "该用户名已被注册" } }

在 1.19.5 中,remote默认使用 GET 请求,但为了安全性、参数长度和避免缓存,推荐改成 POST。这里有一个高频问题和我开头提到的热搜词直接相关:jQuery content type 怎么设置。在 remote 请求里,如果后端需要你传输 JSON 格式,必须单独设置contentType

remote: { url: "/api/user/checkUsername", type: "post", contentType: "application/json", data: JSON.stringify({ username: function () { return $("#username").val(); } }) }

如果后端是普通 form 表单格式接收,就不要去手动设置contentType,保持 jQuery 默认的application/x-www-form-urlencoded; charset=UTF-8即可。很多新手在这里强行设置 JSON 反而导致后端解析不了,白白踩坑。

远程验证的返回格式也需要注意,后端只需要返回true表示验证通过,返回false或带消息的字符串表示不通过。不要绕一圈返回一个{code: 0, data: true}这样的包装格式,插件并不认。

3.2 自定义验证规则

内置规则不能满足业务时,用$.validator.addMethod扩展即可。这个 API 在 1.19.5 里非常稳定,比如我们要加一个“密码不能包含连续三位以上数字”的规则:

$.validator.addMethod("noSequentialNumbers", function (value, element) { var pattern = /(?:012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210)/; return this.optional(element) || !pattern.test(value); }, "密码不能包含连续数字");

然后在 rules 里直接使用:

rules: { password: { required: true, minlength: 6, noSequentialNumbers: true } }

同时建议把一些通用的自定义方法(手机号、身份证、正数校验等)单独抽成一个custom-validate.js文件,全项目复用。从 1.19.5 开始,插件的错误提示元素默认是<label>,如果你要用工具提示或者其他 UI 组件(比如在输入框下方显示一行红字),可以通过errorElementerrorPlacement来控制。

$("#myForm").validate({ errorElement: "span", errorPlacement: function (error, element) { error.insertAfter(element); } });

3.3 与 ajax 提交并存

很多时候表单校验通过之后,还要用 ajax 代替传统的表单提交。这时候直接用submitHandler是标准做法,也是 1.19.5 文档推荐的方式,转头再说一下搜索引擎里另一个热词:jquery 滚动到底部加载更多,这跟你表单验证的关系不大,但如果你现在的页面是无限滚动加载数据的列表,那在新增表单时最好重新调用$(form).valid()来触发即时验证,别直接清空表单了事,后面在动态表单部分我再细说。

$("#myForm").validate({ rules: { // ... 规则配置 }, submitHandler: function (form) { var data = $(form).serializeArray(); $.ajax({ url: "/api/user/register", type: "post", data: data, success: function (res) { alert("注册成功"); } }); return false; // 阻止默认表单提交 } });

有个细节:如果submitHandler里写了return false,就可以安全阻止原生表单提交,避免页面刷新。有些同事喜欢在按钮的 click 事件里写$("#myForm").submit(),这会导致验证和提交逻辑重复绑定,一般情况下不要这么干,把提交逻辑全部收敛到submitHandler里就行。

4. 坑都踩过了,给你一份问题排查清单

4.1 验证不触发,先排查这四件事

这类问题占据了求助帖的八成,我一般按下面顺序排查,基本都能解决:

  1. input 是否有 name 属性。没有 name 的输入框,插件直接忽略,这是最高频的问题。
  2. jQuery 版本和插件加载顺序。必须在引入 validate 之前先引入 jQuery,用 DevTools 的 Network 面板看一下请求顺序。
  3. 是不是在$(function(){})之外初始化了。如果 DOM 还没渲染完就调用.validate(),表单元素找不到,初始化失败。
  4. 是否有重复 id 或嵌套表单。HTML 规范里 id 必须唯一,嵌套 form 会导致插件扫描异常。
<!-- 错误示范:没有 name --> <input type="text" id="username"> <!-- 正确示范 --> <input type="text" name="username" id="username">

4.2 remote 请求的缓存和 contentType 坑

remote 验证最常见的问题是“第一次请求之后,第二次修改了输入,还是提示已存在”。

第一次校验通过(返回 true)后,插件默认会缓存结果,如果你输入的内容发生变化,才会重新请求;但如果你改了内容又改回去,插件可能优先从缓存里读结果。1.19.5 在 remote 的data里加了一个名为remote的隐藏字段(值为请求次数),可以在一定程度上避免浏览器缓存,但如果你用的是 GET,建议直接改成 POST。

另外,刚才说的jquery content type 怎么设置,这里再展开一下:当你的 remote 提交需要 JSON 时,设置contentType: "application/json"后,参数传输方式和 form 表单方式完全不同,后端代码也要对应调整。我见过太多人只改了前端,后端还在读$_POST['username'],结果拿到的永远是空值。后端要么改成读取原始请求体并解析 JSON,要么前端就不改contentType,保持 form 表单提交,两个方案都是通的,任选其一,千万别只改一半。

4.3 动态生成的表单控件验证不生效

弹窗里的表单、ajax 动态渲染的输入框,是另一个高频踩坑点。因为插件在初始化时只扫描当时 DOM 里存在的元素,后面动态添加的输入框不会自动绑定规则。

解决办法是在动态添加完成后,手动调用:

// 动态添加 input 后 $("#myForm").validate().element("#dynamicInput");

或者更粗暴一点,重新初始化插件:

// 销毁后重新初始化 $("#myForm").validate().destroy(); $("#myForm").validate({ ...配置 });

但我不推荐动不动就销毁重建,这样会导致校验消息闪烁,而且如果里面已填写的数据较多,用户体验很差。还有另一个思路,用rules()方法在运行时动态添加规则:

// 动态添加规则 $("#dynamicInput").rules("add", { required: true, minlength: 3 });

这种方式比重新初始化要优雅很多,而且不会清掉已有的错误提示状态。

4.4 中文提示乱码与样式调整

如果你在页面里直接写messages中文内容,却发现页面上显示乱码,先排查引入 JS 文件的 charset 有没有设置为 UTF-8。尤其是本地文件模式,建议在<script>标签加charset="utf-8"

样式方面,默认的错误提示是通过<label>生成并带error类。你可以在 CSS 里统一写成:

label.error { color: #d9534f; font-size: 12px; margin-left: 5px; } input.error { border-color: #d9534f; }

这样视觉上就和 Bootstrap 那套红边框提示很一致。如果你用的 UI 框架要求自定义错误提示容器,errorPlacement可以做任意变化。

4.5 有关“jquery滚动到底部加载更多”的一个小提醒

前面提到了这个热词,这里展开一句。在做滚动加载更多列表时,如果列表内部包含表单元素,每次新增内容后都要检查一下是否需要对新元素执行.rules("add")。我自己遇到过一个场景:列表无限滚动,每一行都有一个备注输入框,在滚动加载后,新行的输入框完全没校验逻辑,最后是一个一个调用element()才解决。所以不要觉得这是两个无关功能,在同一个页面里,它们非常容易互相影响。

5. 几个实际项目的经验细节

1.19.5 这个版本用下来,我自己感受比较深的一点是它的错误消息机制和valid类的切换非常稳定,用$("#myForm").valid()可以随时以编程方式触发整个表单的校验,这在做“下一步”按钮分步表单的时候特别顺手。比如一个分步表单,第一步填完点下一步,此时不需要提交,只需要校验第一步的区域,可以直接这样:

// 只校验第一步区域里的所有输入 var valid = $("#step1 :input").valid(); if (valid) { $("#step1").hide(); $("#step2").show(); }

注意:input是 jQuery 另一个选择器,这里能一次性把所有可见的输入控件都纳入校验。

还有一点就是分组校验。如果同一个页面上有多个表单区域但只共用一套规则,可以给每个 form 单独初始化,或者用groups配置把多个输入框合并成一个错误提示位。比如验证“手机号+验证码”的组合,可以配置:

groups: { phoneGroup: "phone code" }

这样两个输入框的错误消息显示在一个地方,视觉上更清爽。

从后端开发那边拿到接口时,也要确认一下 remote 的错误消息是不是由后端动态返回。比如“用户名包含敏感词”,这种情况下直接在后端返回字符串,前端messages里就不用配 remote 对应的静态文案了,插件会直接显示后端返回的内容。这个灵活度我觉得是 1.19.5 做得不错的地方。

最后一个常见疑问是:既然 Vue、React 都这么流行了,为什么还要写 jQuery 插件的总结?说实话,存量项目太多了,很多后台系统、CMS、旧版 ERP 都是 jQuery 技术栈。只要还在维护这类系统,一个稳定、文档全、坑位清晰的验证插件就是刚需。而且就算你在新项目用 Vue,里面如果嵌入了 jQuery 老页面,这套验证逻辑照样能帮你快速兜底。

我也不是一直就真香,刚用这个插件时,也被它“找不到 name 就静默失败”的机制折腾过很久,但摸熟了之后,确实回不去了。手动校验写得越多,越觉得这种集中配置的插件才是真正适合团队协作的方案。希望这篇对你有帮助,踩过的坑你就不用再踩一遍了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询