一个纯 Javascript 的表单验证组件

2019-02-26 21:31:21 +08:00
 lyric

GitHub: https://github.com/lyricat/vanilla-form-validator

DEMO: https://lyricat.github.io/vanilla-form-validator/demo/

使用方法

假设我们有一个包含 4 个字段的注册表单,每个字段都有不同的要求:

另外,需要一个来自电子邮件和电话领域:如果您填写电子邮件,电话是可选的,反之亦然。

根据上述规则,我们可以定义如下规则:

  var rule = [
    'AND',
    'name',
    ['OR',
      ['RE', /^.+@.+$/, 'email'],
      ['RE', /^[0-9]+$/, 'phone'],
    ],
    ['RE', /^[0-9a-zA-Z]{5}[0-9a-zA-Z]+$/, 'password'],
  ]

可以传入一个 form 元素(如果在浏览器环境):

  function onSubmit(button, evt) {
    var form = document.getElementById('form')
    var ret = FormValidator.test(form, rule)
    console.log(ret)
  }

也可以传入一个字典:

  var ret = FormValidator.test(form, rule)
  console.log(ret)

会得到这样的输出

{
  "pass": true, // 校验通过没有
  "fields": {
    "name": {
      "pass": true,  // 这个字段校验通过没有
      "value": "abc" // 这个字段的内容
    },
    "email": {
      "pass": true,
      "value": "123@abc.com"
    },
    "phone": {
      "pass": false,
      "value": "11223344xx"
    },
    "password": {
      "pass": true,
      "value": "abcdefg"
    }
  },
  "message": "Pass."
}

按照上文的输出,phone 字段没有校验通过,但是由于 email 和 phone 取一个就行,所以整体是通过了的。

2833 次点击
所在节点    分享创造
12 条回复
GM
2019-02-26 21:37:19 +08:00
精神上支持一下。

但是,个人觉得纯 Javascript、无任何依赖不算什么优势,只能是劣势,因为现在几乎没有项目只使用原生 JS 的。
lyric
2019-02-26 22:20:47 +08:00
@GM 没有依赖意味着可以加到任何类型的项目中都不受限。
Mac
2019-02-26 22:32:01 +08:00
@GM 对于那些不满足各种框架功能的要求,原生比在框架上搭省略了学习成本啊。
ayase252
2019-02-26 22:33:55 +08:00
不是,你这没单元测试不敢用啊
lyric
2019-02-26 22:40:02 +08:00
@ayase252 有道理,等我得闲补一下。
meszyouh
2019-02-27 08:15:54 +08:00
没有自定义和异步检验么
lqzhgood
2019-02-27 09:21:59 +08:00
OR: take one or more args, return false if all args are true ???
所有条件为 true 返回 false ?
难道不是只要有一个 true 就返回 true ?
lyric
2019-02-27 10:23:11 +08:00
@lqzhgood 写错了,应该 "if any of them is true."
lyric
2019-02-27 20:17:02 +08:00
@ayase252 补好了~帮我补全点儿呗
azh7138m
2019-02-28 18:03:38 +08:00
@livid 我发现夜间模式看代码是看不到的,至少在手机端看不到
azh7138m
2019-02-28 18:11:15 +08:00
rule 做成对象是不是好点,op 放第一个看着难受,而且目前来看对象解构性能也更好;再次输入密码这种要怎么校验;和楼上一样,这个校验功能只能同步,基本只有个 reg 可以用,有点 emmmmm
lyric
2019-03-04 14:17:14 +08:00
@azh7138m Array 可以少敲几个字符啊。
再次输入密码这种我打算可以传入一个 validateFn 函数来处理。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/539031

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX