HTML : 使用 JavaScript 自定义表单验证

介绍

在按照 Bootstrap - Forms - Validation 对 中的可输入控件进行数据校验时，可以在控件上添加 required、minlength、maxlength 等常规通用的原生验证属性。

当我们有更复杂的业务逻辑时，还可以通过 JavaScript 自定义验证规则，这样就能实现表单验证自由了，本文将介绍如何实现。

使用方法

Copy
function validate(inputID) {
const input = document.getElementById(inputID);
const validityState = input.validity;

if (validityState.valueMissing) {
input.setCustomValidity("你必须填满这个，哟！");
} else if (validityState.rangeUnderflow) {
input.setCustomValidity("我们需要一个更大的数字！");
} else if (validityState.rangeOverflow) {
input.setCustomValidity("太大了！");
} else {
input.setCustomValidity("");
}

// 立刻弹出 HTML 原生的控件验证提示
input.reportValidity();
}

Copy
// 失去焦点后验证密码规则
$('#password').on('blur', function (e) {
const password = $(this).val();
// 一个由我们自定义的验证方法
if (validatePassword(password)) {
// 密码符合要求
// 如果没有错误，需要将消息设置为空字符串，这样表单验证才能通过，也就是调用 checkValidity() 后返回 true
this.setCustomValidity('');
} else {
// 密码不符合要求
// 只要错误消息不为空，表单就不会验证通过(调用 checkValidity() 后返回 false)，也不会被提交
// 由于当前使用 Boostrap 的表单验证提示，所以这里给出的错误消实际上并不会显示在页面上，只是为了让当前控件不通过验证
this.setCustomValidity('Passwords must match');
}

// reportValidity() 会立刻弹出 HTML 原生的控件验证提示，由于当前使用 Bootstrap 的验证提示，所以这里不调用它触发原生的验证提示
//this.reportValidity();
});

参考

表单数据校验

setCustomValidity()

Bootstrap 4 manually invalidate input field natively

Bootstrap - Forms - Validation