JavaScript 怎么用闭包实现一个前端表单字段校验器

千浩同学_4587

千浩同学_4587

2026-09-07

677人浏览

原创

闭包实现表单校验器通过封装规则、错误、值等状态于函数作用域内,提供validate、addrule等方法;每个字段创建独立实例互不干扰;支持同步校验、实时dom反馈及异步规则扩展。

javascript 怎么用闭包实现一个前端表单字段校验器

用闭包实现前端表单字段校验器,核心是把校验规则、错误信息、当前值等状态封装在函数作用域内,避免全局污染,同时支持为不同字段创建独立、可复用的校验实例。

闭包校验器的基本结构

每个校验器是一个返回对象的函数,内部维护私有状态(如规则列表、是否已触发校验),对外只暴露 validate、addRule、setError 等方法:

function createValidator() {
  let value = '';
  let rules = [];
  let errors = [];
  let isTouched = false;

  return {
    setValue(v) { value = v; },
    addRule(test, message) { rules.push({ test, message }); },
    validate() {
      isTouched = true;
      errors = [];
      for (const { test, message } of rules) {
        if (!test(value)) {
          errors.push(message);
        }
      }
      return errors.length === 0;
    },
    getErrors() { return isTouched ? errors : []; },
    isInvalid() { return isTouched && errors.length > 0; }
  };
}

为具体字段创建独立校验器实例

每个输入框对应一个闭包实例,互不干扰。例如邮箱和密码字段各自拥有自己的规则和错误状态:

Java Maven Secondary Analysis
Java Maven Secondary Analysis

分析ZIP压缩包或GitLab仓库中的Java Maven项目,确定二次开发范围、类数量、模块分布及生产相关指标。

下载
const emailValidator = createValidator();
emailValidator.addRule(v => v && /\S+@\S+\.\S+/.test(v), '请输入有效的邮箱');
emailValidator.addRule(v => v.length  v && v.length >= 8, '密码至少 8 位');
pwdValidator.addRule(v => /[A-Z]/.test(v), '密码需包含大写字母');

// 使用示例
emailValidator.setValue('user@');
emailValidator.validate(); // false
console.log(emailValidator.getErrors()); // ['请输入有效的邮箱']

结合 DOM 实现实时校验反馈

将校验器绑定到 input 元素,监听事件并更新 UI:

  • 监听 input 更新值,blur 触发完整校验
  • 根据 isInvalid() 切换输入框边框颜色或显示错误提示元素
  • 错误信息用 getErrors() 获取,避免未失焦时过早提示
const emailInput = document.getElementById('email');
const emailError = document.getElementById('email-error');
const emailVal = createValidator();

emailVal.addRule(v => v && /\S+@\S+\.\S+/.test(v), '邮箱格式不正确');
emailVal.addRule(v => v.length  {
  emailVal.setValue(emailInput.value);
});

emailInput.addEventListener('blur', () => {
  emailVal.validate();
  emailError.textContent = emailVal.isInvalid() 
    ? emailVal.getErrors().join(';') 
    : '';
  emailInput.classList.toggle('error', emailVal.isInvalid());
});

扩展:支持异步规则(如用户名唯一性检查)

闭包内可维护 Promise 状态,提供 validateAsync 方法,返回 Promise,并区分同步/异步错误:

  • 异步规则单独存入 asyncRules 数组
  • validateAsync() 先跑同步校验,再并发执行异步规则
  • 错误统一收集,支持 .then/.catch 链式处理
// 在 createValidator 内部添加:
let asyncRules = [];
// ……
validateAsync() {
  const syncOk = this.validate();
  if (!syncOk) return Promise.resolve(false);

  const asyncChecks = asyncRules.map(({ test, message }) =>
    test(value).then(ok => ok ? undefined : message)
  );

  return Promise.all(asyncChecks).then(results => {
    errors = results.filter(Boolean);
    return errors.length === 0;
  });
}

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5043

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6110

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5638

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

803

5

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4626

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1149

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4564

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

920

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习