js 创建简单的表单同步验证器
SyncValidate
declare const uni: any;
export interface SyncValidateOpt {
[key: string]: SyncValidateFunc[];
}
export interface SyncValidateFunc {
(input: string | number): string | undefined;
}
/**
* 同步验证器
*/
export class SyncValidate {
constructor(public readonly options: SyncValidateOpt) {}
/**
* 验证一个
*
* check({key: value})
* @param {Object} keyVal
*/
check(keyVal: { [key: string]: string | number }): boolean {
const keys = Object.keys(keyVal);
if (!keys.length) {
throw new Error("至少的验证一个.");
}
// 只验证一个
const key = keys[0];
const val = keyVal[key];
if (!this.options.hasOwnProperty(key)) {
throw new Error(`没有设置[${key}]的验证器.`);
}
for (let v of this.options[key]) {
const errorMessage = v(val);
if (errorMessage) {
if (
this.validateErrorListener &&
typeof this.validateErrorListener === "function"
) {
this.validateErrorListener(errorMessage);
} else {
SyncValidate.validateErrorListener(errorMessage);
}
// 验证失败立即返回
return false;
}
}
// 验证ok返回true
return true;
}
/**
* 验证多个
* @param keysVals
*/
checkAll(keysVals: { [key: string]: string | number }): boolean {
for (let key in keysVals) {
if (this.check({ [key]: keysVals[key] }) === false) {
return false;
}
}
return true;
}
// 默认的验证错误时的回调函数
static validateErrorListener(errorMessage: string) {
uni.showToast({
icon: "none",
title: errorMessage,
duration: 1500,
});
}
private validateErrorListener?: (errorMessage: string) => void;
// 添加验证错误时的回调函数
addValidateErrorListener(
validateErrorListener: (errorMessage: string) => void
) {
this.validateErrorListener = validateErrorListener;
}
// 必填
static required(msg: string): SyncValidateFunc {
return (input) => {
if (!input) return msg;
};
}
// 最小长度
static minLength(len: number, msg: string): SyncValidateFunc {
return (input) => {
if (typeof input === "string" && input.length < len) return msg;
};
}
// 最大长度
static maxLength(len: number, msg: string): SyncValidateFunc {
return (input) => {
if (typeof input === "string" && input.length > len) return msg;
};
}
// 简单的验证手机号
static phone(msg: string, exp?: RegExp): SyncValidateFunc {
const phoneExp =
exp ??
/^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$/;
return (input) => {
if (typeof input === "string" && !input.match(phoneExp)) {
return msg;
}
};
}
// 简单的判断相等
static eql(data: any, msg: string): SyncValidateFunc {
return (input) => {
if (input !== data) return msg;
};
}
// 简单的判断相等
static equal(data: any, msg: string): SyncValidateFunc {
return (input) => {
if (input != data) return msg;
};
}
}
使用
const syncValidate = new SyncValidate({
username: [
SyncValidate.required('用户名不能为空!'),
SyncValidate.phone('请输入正确手机号!'),
],
password: [
SyncValidate.required('密码不能为空!'),
SyncValidate.minLength(8, '密码长度必须大于7'),
]
});
syncValidate.addValidateErrorListener((errorMessage) => {
uni.showToast({
icon: 'none',
title: errorMessage,
duration: 1500
});
})
onLogin() {
if (
!syncValidate.check({username: this.username.trim()})
||
!syncValidate.check({password: this.password.trim()})
)
{
return;
}
...
}
js:
class SyncValidate {
constructor(options) {
this.options = options;
}
check(keyVal) {
const keys = Object.keys(keyVal);
if (!keys.length) {
throw new Error("至少的验证一个.");
}
const key = keys[0];
const val = keyVal[key];
if (!this.options.hasOwnProperty(key)) {
throw new Error(`没有设置[${key}]的验证器.`);
}
for (let v of this.options[key]) {
const errorMessage = v(val);
if (errorMessage) {
if (this.validateErrorListener &&
typeof this.validateErrorListener === "function") {
this.validateErrorListener(errorMessage);
}
else {
SyncValidate.validateErrorListener(errorMessage);
}
return false;
}
}
return true;
}
checkAll(keysVals) {
for (let key in keysVals) {
if (this.check({ [key]: keysVals[key] }) === false) {
return false;
}
}
return true;
}
static validateErrorListener(errorMessage) {
uni.showToast({
icon: "none",
title: errorMessage,
duration: 1500,
});
}
addValidateErrorListener(validateErrorListener) {
this.validateErrorListener = validateErrorListener;
}
static required(msg) {
return (input) => {
if (!input)
return msg;
};
}
static minLength(len, msg) {
return (input) => {
if (typeof input === "string" && input.length < len)
return msg;
};
}
static maxLength(len, msg) {
return (input) => {
if (typeof input === "string" && input.length > len)
return msg;
};
}
static phone(msg, exp) {
const phoneExp = exp ??
/^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$/;
return (input) => {
if (typeof input === "string" && !input.match(phoneExp)) {
return msg;
}
};
}
static eql(data, msg) {
return (input) => {
if (input !== data)
return msg;
};
}
static equal(data, msg) {
return (input) => {
if (input != data)
return msg;
};
}
}
js 创建简单的表单同步验证器的更多相关文章
- 原生JS 表单提交验证器
转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...
- JS表单原生验证器
一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部流行的框架,如bootstrap,由于我负责的模块 仅仅是其中的一部分,因此少数服从多数,无 ...
- 创建简单的表单Demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).
Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...
- aspx中的表单验证 jquery.validate.js 的使用 以及 jquery.validate相关扩展验证(Jquery表单提交验证插件)
这一期我们先讲在aspx中使用 jquery.validate插件进行表单的验证, 关于MVC中使用 validate我们在下一期中再讲 上面是效果,下面来说使用步骤 jQuery.Valid ...
- 用jQuery写的最简单的表单验证
近几天完成了关于我们项目的最简单的表单验证,是用jQuery写的,由于之前也一直没学过jQuery,所以自己也是一直处于边摸索边学习的阶段,经过这一段时间的学习,通过查资料啥的,也发现了学习jQuer ...
- angularjs学习第四天笔记(第一篇:简单的表单验证)
您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ...
- Struts2之Action三种接收参数形式与简单的表单验证
有了前几篇的基础,相信大家对于Struts2已经有了一个很不错的认识,本篇我将为大家介绍一些关于Action接收参数的三种形式,以及简单的表单验证实现,下面进入正题,首先我们一起先来了解一下最基本的A ...
- 使用 layUI做一些简单的表单验证
使用 layUI做一些简单的表单验证 <form method="post" class="layui-form" > <input name ...
随机推荐
- wireshark使用手册
Wireshark的过滤器 使用Wireshark时最常见的问题,是当您使用默认设置时,会得到大量冗余信息,以至于很难找到自己需要的部分. 过犹不及. 这就是为什么过滤器会如此重要.它们可以帮助我们在 ...
- Mysql,Oracle与Java字段类型映射关系
Mysql,Oracle与Java字段类型映射关系 参考相关博文 MySQL/Oracle字段类型 Java字段类型 最大长度 BIT java.lang.Boolean 1 BLOB java.la ...
- Centos搭建spark
Centos搭建spark 一.spark介绍 二.spark安装前提 三.集群规划 四.spark安装 五.修改spark环境变量 六.修改spark-env.sh 七.修改slaves 八.将安装 ...
- jquery的ajax提交时加载处理方法
1.定义全局的,就是所有的ajax的请求的加载都会出现相同的提示 $(function(){ //加载成功显示的状态 $("#showLoading").ajaxSuccess(f ...
- C++基本之--静态成员函数和静态成员变量
#include <iostream> using namespace std; class Internet { public: Internet(char *name,char *ad ...
- php-浅谈php底层机制
php-浅谈php底层机制 1. PHP的设计理念及特点 多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响,当然,随着时代发展,PHP也早已支持多线 ...
- 算法-迪杰斯特拉算法(dijkstra)-最短路径
迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...
- 我用了半年的时间,把python学到了能出书的程度
Python难学吗?不难,我边做项目边学,过了半年就通过了出版社编辑的面试,接到了一本Python选题,并成功出版. 有同学会说,你有编程基础外带项目实践机会,所以学得快.这话不假,我之前的基础确实加 ...
- Dedecms织梦搜索页显示条数的更改方法
织梦dedecms搜索结果页面的显示条数默认是10条,这个数值在模板当中是不能控制的. 解决方法: 打开根目录下的plus文件夹,找到search.php修改一段代码: 在大概第15行,找到 $ pa ...
- 爬虫入门到放弃系列02:html网页如何解析
前言 上一篇文章讲了爬虫的概念,本篇文章主要来讲述一下如何来解析爬虫请求的网页内容. 一个简单的爬虫程序主要分为两个部分,请求部分和解析部分.请求部分基本一行代码就可以搞定,所以主要来讲述一下解析部分 ...