前端表单验证进阶:如何使用 jQuery.validator.addMethod() 编写自定义验证器(全是干货,建议收藏)
🔍 背景介绍
在使用 jQuery Validation 插件时,我们通常会写这样一段代码:
<input name="startTime" required>
然后通过规则设定完成验证:
$('#form').validate({rules: {startTime: {required: true}}
});
然而,有时候我们需要“业务自定义规则”,比如:
❗ 用户不能选择
00:00
作为时间。
这时内建的 required
, min
, max
等规则就不够用了。我们该怎么办?
别慌!这就是 jQuery.validator.addMethod()
登场的时机!
🧩 一、认识 addMethod
的基本用法
jQuery.validator.addMethod(name, method, message);
参数 | 说明 |
---|---|
name | 自定义验证方法的名称 |
method | 验证函数 (value, element) => boolean |
message | 出错时的默认提示文字(也可传函数) |
⚠️ 重点:返回
true
表示验证通过,false
表示不通过!
🧪 二、实战案例:禁止用户选择 00:00 时间
✅ 场景说明
我们要求用户选择一个时间,但不能是 00:00
。这是许多系统(如排班系统、定时任务等)中常见的需求。
💡 HTML 示例
<form id="myForm"><label>开始时间:</label><input name="startTime" type="datetime-local" required><button type="submit">提交</button>
</form>
🧠 自定义验证器实现
jQuery.validator.addMethod("notZeroTime", function (value, element) {if (!value) return true; // 空值跳过,交由 required 处理const date = new Date(value);if (isNaN(date)) return false;const isZeroTime = date.getHours() === 0 && date.getMinutes() === 0;if (isZeroTime) {$(element).data('error-msg', 'Date and time are required.');}return this.optional(element) || !isZeroTime;
}, function (params, element) {// 自定义错误信息来源:绑定在 DOM 元素上的 datareturn $(element).data('error-msg');
});
🛠 应用验证规则
$('#myForm').validate({rules: {startTime: {required: true,notZeroTime: true}}
});
📦 三、封装成模块化函数(推荐)
更优雅的方式是将它封装起来,便于复用和测试。
function registerNotZeroTimeValidator() {jQuery.validator.addMethod("notZeroTime", function (value, element) {if (!value) return true; // 空值跳过,交由 required 处理const date = new Date(value);if (isNaN(date)) return false;const isZeroTime = date.getHours() === 0 && date.getMinutes() === 0;if (isZeroTime) {$(element).data('error-msg', 'Date and time are required.');}return this.optional(element) || !isZeroTime;
}, function (params, element) {// 自定义错误信息来源:绑定在 DOM 元素上的 datareturn $(element).data('error-msg');
});
}
然后在页面初始化时调用:
$(function () {registerNotZeroTimeValidator();$('#myForm').validate({rules: {cutOffDate: { required: true, notZeroTime: true },pickUpDate: { required: true },},messages: { cutOffDate: {required: "This VGM Cut Off Date is required.",notZeroTime: function (param, element) { return $(element).data('error-msg'); },},pickUpDate: "This Full Container Pick Up Date is required.",}});
});
📚 四、更多实战技巧
✅ 1. 使用函数生成错误信息(支持多语言)
addMethod("myRule", (value, element) => false, (params, element) => {return getLocalizedMessage('invalid_input');
});
✅ 2. 使用 this.optional(element)
是关键
该方法可以优雅处理“可选字段”的场景。建议所有自定义验证器中都加上它。
return this.optional(element) || /* 其他验证逻辑 */;
✅ 3. 与 data-*
属性结合,灵活传参
你还可以动态传参或自定义提示语,比如:
<input name="deadline" data-limit-hour="17">
addMethod("beforeHour", function (value, element) {const limit = parseInt($(element).data('limit-hour') || 0, 10);const hour = new Date(value).getHours();return hour <= limit;
}, "时间不能超过限定小时!");
🎯 五、总结:自定义验证的正确姿势
步骤 | 操作 |
---|---|
1️⃣ | 使用 addMethod 注册验证器 |
2️⃣ | 使用 this.optional(element) 支持非必填 |
3️⃣ | 自定义错误消息,支持函数返回 |
4️⃣ | 在 .validate() 中添加规则即可使用 |
5️⃣ | 可以封装为模块,提升复用性 |