贝博恩创新科技网

FormValidator如何快速上手验证表单?

FormValidator 使用教程

目录

  1. 第一部分:基础入门

    FormValidator如何快速上手验证表单?-图1
    (图片来源网络,侵删)
    • 什么是表单验证?
    • 为什么需要前端验证?
    • 准备工作:引入 Validator.js
    • 你的第一个验证:validate()
  2. 第二部分:核心概念与常用验证规则

    • 验证规则
    • 常用内置验证器详解
    • 验证选项
  3. 第三部分:进阶用法

    • 自定义错误消息
    • 自定义验证器
    • 验证单个值 vs. 验证整个对象
    • 异步验证(如检查用户名是否已存在)
  4. 第四部分:与前端框架集成(React/Vue)

    • React 示例
    • Vue 示例
  5. 第五部分:最佳实践与完整示例

    FormValidator如何快速上手验证表单?-图2
    (图片来源网络,侵删)
    • 验证时机
    • UI 反馈
    • 完整的 HTML + JavaScript 示例

第一部分:基础入门

什么是表单验证?

表单验证是指在用户提交表单数据之前,对输入的数据进行检查,以确保其格式、类型、长度等符合预期的规则,检查邮箱地址是否有效、密码长度是否足够、必填字段是否为空等。

为什么需要前端验证?

  • 提升用户体验:即时反馈错误,让用户在输入时就能修正,而不是等到提交后才发现问题。
  • 减轻服务器压力:过滤掉大量无效或格式错误的数据,只将有效数据发送到服务器。
  • 增强安全性:虽然是前端验证,但能有效防止一些简单的恶意脚本提交。

注意:前端验证不能替代后端验证!后端验证是保证数据安全的最后一道防线。

准备工作:引入 Validator.js

你可以通过两种方式引入 Validator.js:

直接引入(HTML 文件)

FormValidator如何快速上手验证表单?-图3
(图片来源网络,侵删)

在 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)都接收一个值,并根据其逻辑返回 truefalse

常用内置验证器详解

验证器 描述 示例
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>

第五部分:最佳实践与完整示例

验证时机

  • 提交时验证:最基本的方式,在用户点击“提交”按钮时进行验证。
  • 实时验证:在用户输入时(onBluronChange)进行验证,提供即时反馈,体验更好。
  • 格式化提示:在输入时提供格式提示(如输入手机号时自动添加空格或短横线),可以减少用户输入错误。

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 文件中,在浏览器中打开即可看到效果。

分享:
扫描分享到社交APP
上一篇
下一篇