FormValidator 使用教程
目录
-
第一部分:基础入门
(图片来源网络,侵删)- 什么是表单验证?
- 为什么需要前端验证?
- 准备工作:引入 Validator.js
- 你的第一个验证:
validate()
-
第二部分:核心概念与常用验证规则
- 验证规则
- 常用内置验证器详解
- 验证选项
-
第三部分:进阶用法
- 自定义错误消息
- 自定义验证器
- 验证单个值 vs. 验证整个对象
- 异步验证(如检查用户名是否已存在)
-
第四部分:与前端框架集成(React/Vue)
- React 示例
- Vue 示例
-
第五部分:最佳实践与完整示例
(图片来源网络,侵删)- 验证时机
- UI 反馈
- 完整的 HTML + JavaScript 示例
第一部分:基础入门
什么是表单验证?
表单验证是指在用户提交表单数据之前,对输入的数据进行检查,以确保其格式、类型、长度等符合预期的规则,检查邮箱地址是否有效、密码长度是否足够、必填字段是否为空等。
为什么需要前端验证?
- 提升用户体验:即时反馈错误,让用户在输入时就能修正,而不是等到提交后才发现问题。
- 减轻服务器压力:过滤掉大量无效或格式错误的数据,只将有效数据发送到服务器。
- 增强安全性:虽然是前端验证,但能有效防止一些简单的恶意脚本提交。
注意:前端验证不能替代后端验证!后端验证是保证数据安全的最后一道防线。
准备工作:引入 Validator.js
你可以通过两种方式引入 Validator.js:
直接引入(HTML 文件)

在 HTML 文件的 <head> 或 <body> 底部,通过 CDN 引入。
<!-- 引入 Validator.js 的最新版本 --> <script src="https://cdn.jsdelivr.net/npm/validator@13.11.0/validator.min.js"></script>
使用 npm(适用于现代项目)
如果你的项目使用 Node.js 或构建工具(如 Webpack, Vite),可以通过 npm 安装。
npm install validator
然后在你的 JavaScript 文件中引入:
const validator = require('validator'); // CommonJS
// 或者
import validator from 'validator'; // ES Modules
你的第一个验证:validate()
validator.js 的核心是 validator.is(value, validatorName, options?) 方法。
// 检查一个字符串是否是有效的邮箱地址 const email = 'test@example.com'; const isValidEmail = validator.isEmail(email); console.log(isValidEmail); // 输出: true // 检查一个字符串是否是数字 const age = '25'; const isNumeric = validator.isNumeric(age); console.log(isNumeric); // 输出: true
第二部分:核心概念与常用验证规则
验证规则
每个验证器(如 isEmail, isLength)都接收一个值,并根据其逻辑返回 true 或 false。
常用内置验证器详解
| 验证器 | 描述 | 示例 |
|---|---|---|
isEmail() |
检查是否为有效的电子邮件地址。 | validator.isEmail('foo@bar.com') // true |
isURL() |
检查是否为有效的 URL。 | validator.isURL('https://google.com') // true |
isAlpha() |
检查字符串是否仅包含字母。 | validator.isAlpha('hello') // true |
isNumeric() |
检查字符串是否仅包含数字。 | validator.isNumeric('123') // true |
isAlphanumeric() |
检查字符串是否仅包含字母和数字。 | validator.isAlphanumeric('abc123') // true |
isLength({ min, max }) |
检查字符串长度是否在指定范围内。 | validator.isLength('hello', { min: 3, max: 5 }) // true |
isEmpty() |
检查字符串是否为空或只包含空白字符。 | validator.isEmpty('') // true |
equals() |
检查两个字符串是否相等。 | validator.equals('abc', 'abc') // true |
isIn() |
检查字符串是否在给定的数组中。 | validator.isIn('apple', ['apple', 'banana']) // true |
isStrongPassword() |
检查密码强度(可配置)。 | validator.isStrongPassword('SuperP@ssw0rd') // true |
isInt() |
检查是否为有效的整数。 | validator.isInt('123') // true |
验证选项
很多验证器支持第三个参数 options,用于自定义验证行为。
// isLength 示例
const password = 'mypassword';
validator.isLength(password, { min: 8 }); // 至少8个字符,返回 true
// isStrongPassword 示例
validator.isStrongPassword('weak', {
minLength: 8,
minLowercase: 1,
minUppercase: 1,
minNumbers: 1,
minSymbols: 1,
}); // 返回 false,因为不满足所有条件
第三部分:进阶用法
自定义错误消息
validator.js 本身不提供错误消息管理,它的职责是返回 true/false,错误消息的管理通常由你自己的业务逻辑或 UI 框架来处理。
一个简单的实现方式是:
const errors = {};
const data = { username: 'a', email: 'invalid' };
if (!validator.isLength(data.username, { min: 3 })) {
errors.username = '用户名长度至少为3个字符';
}
if (!validator.isEmail(data.email)) {
errors.email = '请输入有效的邮箱地址';
}
console.log(errors); // { username: '用户名长度至少为3个字符', email: '请输入有效的邮箱地址' }
自定义验证器
你可以使用 validator.extend() 方法来创建自己的验证逻辑。
// 创建一个验证 "Chinese Mobile Number" 的自定义验证器
validator.extend('isChineseMobile', (value) => {
const regex = /^1[3-9]\d{9}$/;
return regex.test(value);
});
// 使用自定义验证器
const phone = '13812345678';
console.log(validator.isChineseMobile(phone)); // true
const phone2 = '12345678901';
console.log(validator.isChineseMobile(phone2)); // false
验证单个值 vs. 验证整个对象
单个值验证:如上所示,直接调用 validator.is(value, ...)。
整个对象验证:更常见的场景是验证一个包含多个字段的对象,你需要遍历对象的每个属性,并为其应用相应的验证规则。
const user = {
name: 'John Doe',
email: 'john@example.com',
age: '30',
};
const errors = {};
const rules = {
name: (value) => validator.isLength(value, { min: 3 }),
email: (value) => validator.isEmail(value),
age: (value) => validator.isInt(value),
};
Object.keys(rules).forEach(key => {
if (!rules[key](user[key])) {
errors[key] = `${key} is invalid.`; // 可以更具体
}
});
if (Object.keys(errors).length > 0) {
console.log('表单验证失败:', errors);
} else {
console.log('表单验证通过!');
}
异步验证
对于需要从服务器获取数据才能完成的验证(如检查用户名是否被占用),你需要使用异步操作。
// 模拟一个检查用户名是否存在的 API
async function checkUsernameExists(username) {
// 这里应该是真实的 API 调用,fetch('/api/check-username?username=' + username)
return new Promise(resolve => {
setTimeout(() => {
resolve(username === 'existing_user'); // 如果是 'existing_user',则返回 true
}, 500);
});
}
// 使用 async/await 进行异步验证
async function validateUsername(username) {
if (!validator.isLength(username, { min: 3 })) {
return { valid: false, message: '用户名太短' };
}
const exists = await checkUsernameExists(username);
if (exists) {
return { valid: false, message: '用户名已被占用' };
}
return { valid: true, message: '' };
}
// 调用异步验证
(async () => {
const result1 = await validateUsername('new_user');
console.log(result1); // { valid: true, message: '' }
const result2 = await validateUsername('existing_user');
console.log(result2); // { valid: false, message: '用户名已被占用' }
})();
第四部分:与前端框架集成
React 示例
在 React 中,通常将验证逻辑放在 handleSubmit 事件处理函数中。
import React, { useState } from 'react';
import validator from 'validator';
function RegistrationForm() {
const [formData, setFormData] = useState({ name: '', email: '' });
const [errors, setErrors] = useState({});
const handleChange = (e) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};
const handleSubmit = (e) => {
e.preventDefault();
const newErrors = {};
if (!validator.isLength(formData.name, { min: 3 })) {
newErrors.name = '用户名至少3个字符';
}
if (!validator.isEmail(formData.email)) {
newErrors.email = '邮箱格式无效';
}
if (Object.keys(newErrors).length > 0) {
setErrors(newErrors);
} else {
alert('表单提交成功!');
// 提交到服务器...
}
};
return (
<form onSubmit={handleSubmit}>
<div>
<label>用户名:</label>
<input type="text" name="name" value={formData.name} onChange={handleChange} />
{errors.name && <p style={{ color: 'red' }}>{errors.name}</p>}
</div>
<div>
<label>邮箱:</label>
<input type="email" name="email" value={formData.email} onChange={handleChange} />
{errors.email && <p style={{ color: 'red' }}>{errors.email}</p>}
</div>
<button type="submit">注册</button>
</form>
);
}
Vue 示例
在 Vue 3 的 Composition API 中,可以这样实现。
<template>
<form @submit.prevent="handleSubmit">
<div>
<label>用户名:</label>
<input type="text" v-model="form.name" />
<p v-if="errors.name" style="color: red;">{{ errors.name }}</p>
</div>
<div>
<label>邮箱:</label>
<input type="email" v-model="form.email" />
<p v-if="errors.email" style="color: red;">{{ errors.email }}</p>
</div>
<button type="submit">注册</button>
</form>
</template>
<script>
import { ref } from 'vue';
import validator from 'validator';
export default {
setup() {
const form = ref({ name: '', email: '' });
const errors = ref({});
const validateForm = () => {
errors.value = {};
if (!validator.isLength(form.value.name, { min: 3 })) {
errors.value.name = '用户名至少3个字符';
}
if (!validator.isEmail(form.value.email)) {
errors.value.email = '邮箱格式无效';
}
};
const handleSubmit = () => {
validateForm();
if (Object.keys(errors.value).length === 0) {
alert('表单提交成功!');
// 提交到服务器...
}
};
return { form, errors, handleSubmit };
},
};
</script>
第五部分:最佳实践与完整示例
验证时机
- 提交时验证:最基本的方式,在用户点击“提交”按钮时进行验证。
- 实时验证:在用户输入时(
onBlur或onChange)进行验证,提供即时反馈,体验更好。 - 格式化提示:在输入时提供格式提示(如输入手机号时自动添加空格或短横线),可以减少用户输入错误。
UI 反馈
- 错误提示:在输入框下方用红色文字清晰地提示错误原因。
- 视觉样式:给无效的输入框添加红色边框或背景色。
- 禁用提交按钮:当表单有任何错误时,禁用提交按钮,直到所有错误被修正。
完整的 HTML + JavaScript 示例
这是一个包含实时验证、自定义错误消息和清晰 UI 反馈的完整示例。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">表单验证示例</title>
<style>
body { font-family: sans-serif; line-height: 1.6; padding: 20px; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input { width: 100%; padding: 8px; box-sizing: border-box; border: 1px solid #ccc; border-radius: 4px; }
input.error { border-color: #ff4d4d; background-color: #fff0f0; }
.error-message { color: #ff4d4d; font-size: 0.9em; margin-top: 5px; display: none; }
.error-message.show { display: block; }
button { padding: 10px 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
button:disabled { background-color: #cccccc; cursor: not-allowed; }
</style>
</head>
<body>
<h1>用户注册</h1>
<form id="registrationForm">
<div class="form-group">
<label for="username">用户名</label>
<input type="text" id="username" name="username" placeholder="请输入用户名 (至少3个字符)">
<div id="username-error" class="error-message">用户名长度至少为3个字符</div>
</div>
<div class="form-group">
<label for="email">电子邮箱</label>
<input type="email" id="email" name="email" placeholder="请输入电子邮箱">
<div id="email-error" class="error-message">请输入有效的邮箱地址</div>
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" id="password" name="password" placeholder="请输入密码 (至少8位,包含大小写字母和数字)">
<div id="password-error" class="error-message">密码必须至少8位,且包含大小写字母和数字</div>
</div>
<button type="submit" id="submitBtn">注册</button>
</form>
<!-- 引入 Validator.js -->
<script src="https://cdn.jsdelivr.net/npm/validator@13.11.0/validator.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', () => {
const form = document.getElementById('registrationForm');
const submitBtn = document.getElementById('submitBtn');
const inputs = form.querySelectorAll('input');
// 验证规则
const validationRules = {
username: (value) => validator.isLength(value, { min: 3 }),
email: (value) => validator.isEmail(value),
password: (value) => validator.isStrongPassword(value, {
minLength: 8,
minLowercase: 1,
minUppercase: 1,
minNumbers: 1,
}),
};
// 检查整个表单是否有效
const isFormValid = () => {
let isValid = true;
inputs.forEach(input => {
if (!validationRules[input.name](input.value)) {
isValid = false;
}
});
return isValid;
};
// 显示/隐藏错误信息
const toggleError = (input, showError) => {
const errorElement = document.getElementById(`${input.name}-error`);
if (showError) {
input.classList.add('error');
errorElement.classList.add('show');
} else {
input.classList.remove('error');
errorElement.classList.remove('show');
}
};
// 实时验证
inputs.forEach(input => {
input.addEventListener('input', () => {
const isValid = validationRules[input.name](input.value);
toggleError(input, !isValid);
submitBtn.disabled = !isFormValid();
});
});
// 提交表单
form.addEventListener('submit', (event) => {
event.preventDefault();
// 最终验证一次
inputs.forEach(input => {
const isValid = validationRules[input.name](input.value);
toggleError(input, !isValid);
});
if (isFormValid()) {
alert('注册成功!');
// form.submit(); // 如果需要,可以取消注释这行来真正提交表单
} else {
submitBtn.disabled = true;
}
});
// 初始状态:禁用提交按钮
submitBtn.disabled = true;
});
</script>
</body>
</html>
这个示例展示了如何将 validator.js 无缝集成到一个实际的网页中,提供了良好的用户体验,你可以直接复制这段代码到一个 .html 文件中,在浏览器中打开即可看到效果。
