讲师中心 微信公众号
AI工具推荐 视频效率加速

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

千浩同学_4587

千浩同学_4587

发布时间:2026-09-07 12:53:19

|

677人浏览过

|

来源于php中文网

原创

闭包实现表单校验器通过封装规则、错误、值等状态于函数作用域内,提供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 Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
const emailValidator = createValidator();
emailValidator.addRule(v => v && /\S+@\S+\.\S+/.test(v), '请输入有效的邮箱');
emailValidator.addRule(v => v.length <= 100, '邮箱长度不能超过 100 字符');

const pwdValidator = createValidator();
pwdValidator.addRule(v => 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:

立即学习“Java免费学习笔记(深入)”;

  • 监听 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 <= 100, '邮箱太长了');

emailInput.addEventListener('input', () => {
  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;
  });
}

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

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

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

2303

2023.08.11

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

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

4983

2023.10.09

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

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

6070

2024.03.19

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

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

5578

2024.03.22

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

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

783

2024.05.22

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

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

4586

2023.06.20

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

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

1149

2023.07.04

js四舍五入
js四舍五入

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

4504

2023.07.04

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

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

精品课程

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

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn