原生javascript编写的表单验证组件

最近在开发过程中又遇到了表单验证的问题,当然这也是不可避免的,用户输入哪个不需要前端验证的。
HTML5的自带表单验证也是早有耳闻,确实新的INPUT类型很好用,但是自带的表单验证必须在点击submit进行提交时才会触发,以至于在用Ajax提交表单的时候自带的表单验证会显得极其麻烦,并且不能实现随输入验证。

虽然不管是JQuery还是大神们写的表单验证组件都能很好地解决这个问题,但是还是想自己写一个,毕竟还是以学习为目的,光是用别人写过的东西会把自己用成一个 XX

好了,,下面进入正题

设计思想

这个表单验证组件的验证条件是以一个过滤器为单位的,每个输入元素都可以绑定一组过滤器,在验证的时候则依次运行每个过滤器,如果其中一个过滤器没有通过,则视为输入验证不通过并跳出验证。在验证时提供两个回掉函数,分别是验证通过和不通过时,在验证过后运行。

外界可以调用的函数为: 添加过滤器, 验证, 过滤输入

构造

formValidator()

没什么说的,就new就行

添加过滤器

Boolean setFilter(HTMLInputElement: inputElement, Object: options, Function?: exec)

这里的inputElement就是要绑定的输入元素,options是一系列关于过滤器的设置, exec则是在绑定自定义过滤器的时候需要的一个执行过滤的函数,传入的参数为要验证的内容

执行验证

Boolean check(HTMLInputElement: inputElement, Object: options)

inputElement是要验证的输入元素,
options是包含回掉函数的设置的一个对象, 包含两个成员函数
success: 成功后调用的函数,参数为当前的输入
error: 失败后调用的函数,参数为错误消息,即验证错误信息

过滤输入

Boolean filterInput(HTMLInputElement: inputElement, Object: options)

这个和check的用法一样,只是这个相当于是在keypress时间上绑定了验证过程

值得一提的是,在添加过滤器的设置里有一项是 locked, 这个代表了这个过滤器在过滤输入时是否有效,如果是false则在过滤输入时不考虑这个过滤器,也就是说当这个过滤器不满足时并不会阻止用户输入,但是依然会验证。

过滤器类型

requiredFilter

验证输入是否为空

options:
    type: "required"
    message: 用户自定义的验证提示信息
    locked: true|false   

patternFilter

根据一个正则表达式来验证输入的过滤器

options:
    type: "pattern"
    name: 默认正则表达式的名字
    message: 用户自定义的验证提示信息
    pattern: 一个用户自定义的正则表达式,如果默认的正则表达式不能满足需求则提供这个设置
    locked: true|false

当前支持的正则规则:
    numeric: 数字
    integer: 整数
    decimal: 小数
    email:  检查是否为正确的Email格式
    alpha:  英文字符
    alphaNumeric:  英文字符或者数字
    alphaDash:  英文字符或者破折号
    natural: 自然数
    naturalNoZero: 非0自然数
    ip:  合法IP
    base64:  base64字符
    numericDash: 数字或破折号
    url:  合法url

twinsFilter

检查输入是否和另一个输入相同

options:
    type: "twin"
    bound: 另一个输入元素
    message: 用户自定义的验证提示信息
    locked: true|false   

            var validator = new formValidator();
            validator.setFilter(input1, {
                type: "required",
                locked: true
            });

            validator.setFilter(input1, {
                type: "pattern",
                name: "email",
                message: "请输入邮箱",
                locked: true
            });

            validator.setFilter(input2, {
                type: "required",
                message: "请与上面输入保持一致",
                locked: true
            });

            validator.setFilter(input2, {
                type: "pattern",
                name: "numeric",
                message: "请输入数字",
                locked: false
            });

            validator.setFilter(input2, {
                type: "twin",
                bound: input1,
                message: "请与上面输入保持一致",
                locked: true
            });

            validator.eventUtil.addHandler(input1, "input",
                function (event) {
                    validator.check(input1, {
                        success: function () {
                            p1.innerHTML = "";
                        },
                        error: function (message) {
                            p1.innerHTML = message;
                        }
                    });
                });

            validator.eventUtil.addHandler(input2, "input",
                function (event) {
                    validator.check(input2, {
                        success: function () {
                            p2.innerHTML = "";
                        },
                        error: function (message) {
                            p2.innerHTML = message;
                        }
                    });
                });

            /*validator.filterInput(input, {
                success: function () {
                    p.innerHTML = "";
                },
                error: function (message) {
                    p.innerHTML = message;
                }
            });*/

总结

目前还有相当多的不足, 比如,只能实现类文本输入的过滤,对于select 和 radio 并不支持, 而且,能验证的正则表达式还差好多。

好在设计的时候把验证规则封装成了过滤器,这样在下一步扩展的时候省了不少事情

以后还打算添加一些例如日期相关过滤器,颜色过滤器,select过滤器等等,也希望大家看到这篇文章的可以给我留个言,,多多指教。

具体的代码就不这这里写了,大家想看的可以到github上看,只是注释都是英文,这也是我本人的一个习惯。

github

https://github.com/sallerli1/formValidator

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • AngularJS是什么?AngularJs(后面就简称ng了)是一个用于设计动态web应用的结构框架。首先,它是...
    200813阅读 1,602评论 0 3
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,048评论 0 29
  • ng-model 指令ng-model 指令 绑定 HTML 元素 到应用程序数据。ng-model 指令也可以:...
    壬万er阅读 868评论 0 2
  • 喜欢上一个人,便想守在他身边,不离不弃。 安之若素也好,颠沛流离也罢,他在身边就是好的。 他在身边,才会心安。他不...
    懒懒的阳光房阅读 171评论 0 1