├── .gitignore ├── LICENSE ├── validator.html ├── README.md └── js └── ldvalidator.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | .idea -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 零度逍遥 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /validator.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | LDValidator 6 | 7 | 8 | 9 |
10 |
11 | 年龄: 12 |
13 |
14 | 姓名: 15 |
16 |
17 | 重复姓名: 18 |
19 | 20 |
21 | 22 | 23 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LDValidate 2 | 小巧的表单验证组件,使用原生js,不需要任何类库,只做验证工作,不涉及UI 3 | 4 | ## 1. 创建实例 5 | ``` 6 | let formValidator = new LDValidator(id, options); 7 | ``` 8 | 9 | - id 需要验证表单的父级元素id 10 | - options 11 | 12 | | 参数 | 类型 | 说明| 13 | | :----: | :----: | :----: | 14 | | name | Object | 见下方name | 15 | 16 | - name 需要验证元素的name值 17 | 18 | | 参数 | 类型 | 说明| 19 | | :----: | :----: | :----: | 20 | | required | Boolean | 是否必填| 21 | | msg | String | 必填验证不通过时错误提示 | 22 | | equal | Object | 见下方equal | 23 | | scopes | Array | 见下方scopes | 24 | | patterns | Array | 见下方patterns | 25 | 26 | - equal 判断是否与另一元素相等,例验证password和repassword 27 | 28 | | 参数 | 类型 | 说明| 29 | | :----: | :----: | :----: | 30 | | name | String | 对比判断的表单元素name | 31 | | msg | String | 相等验证不通过时错误提示 | 32 | 33 | - scopes 判断表单元素值是否在某一个范围内 34 | 35 | | 参数 | 类型 | 说明| 36 | | :----: | :----: | :----: | 37 | | | Object | 最小值的Object | 38 | | min | Number | 最小值 | 39 | | msg | String | 最小值验证不通过时错误提示 | 40 | | | Object | 最大值的Object | 41 | | max | Number | 最大值 | 42 | | msg | String | 最大值验证不通过时错误提示 | 43 | 44 | - patterns 判断表单元素值是否符合某个正则 45 | 46 | | 参数 | 类型 | 说明| 47 | | :----: | :----: | :----: | 48 | | | Object | | 49 | | reg | Reg | 正则表达式 | 50 | | msg | String | 验证不通过时错误提示 | 51 | 52 | ## 2. 验证方法 53 | ``` 54 | formValidator.validate(); 55 | ``` 56 | 57 | 58 | ## 3. 获取验证结果 59 | ``` 60 | formValidator.isPass; 61 | ``` 62 | 63 | ## 4. 验证结果对象 64 | ``` 65 | formValidator.validation; 66 | ``` 67 | 68 | - validation 69 | 70 | | 参数 | 类型 | 说明| 71 | | :----: | :----: | :----: | 72 | | msg | String | 验证不通过时错误提示 | 73 | | valid | Boolean | 表单是否验证通过 | 74 | | name | Object | 见下方name | 75 | 76 | - name 验证元素的name值 77 | 78 | | 参数 | 类型 | 说明| 79 | | :----: | :----: | :----: | 80 | | msg | String | 验证不通过时错误提示 | 81 | | valid | Boolean | 表单是否验证通过 | 82 | 83 | ## 示例(可参考 [validator.html](https://github.com/lingdublog/LDValidate/blob/master/validator.html) ) 84 | ``` 85 | 86 | 87 | 88 | 89 | var formValidator = new Validator({ 90 | age: { 91 | required: true, 92 | msg: 'age必填', 93 | scopes:[{ 94 | min: 20, 95 | msg: 'age必须大于20' 96 | }, { 97 | max: 30, 98 | msg: 'age必须小于30' 99 | }], 100 | patterns: [{ 101 | reg: /^[0-9]+$/, 102 | msg: 'age请填入数字' 103 | }], 104 | }, 105 | name: { 106 | required: true, 107 | msg: 'name必填' 108 | } 109 | }) 110 | 111 | function submit (){ 112 | // 必须先执行这一步 113 | formValidator.validate(); 114 | // 这里才能获得结果 115 | if(formValidator.isPass){ 116 | console.log('通过'); 117 | }else{ 118 | console.log(formValidator.validation.msg); 119 | console.log(formValidator.validation.age.msg); 120 | console.log(formValidator.validation.name.msg); 121 | } 122 | } 123 | ``` 124 | 125 | ## 在线示例 126 | [表单验证](http://works.lingdublog.cc/validator/validator.html) -------------------------------------------------------------------------------- /js/ldvalidator.js: -------------------------------------------------------------------------------- 1 | window.LDValidator = Validator; 2 | 3 | // 表单验证 4 | function Validator(parentId, options){ 5 | this.parent = document.getElementById(parentId); 6 | // 保存最终验证对象 7 | this.validation = {valid: false, msg: ''}; 8 | this.options = options; 9 | } 10 | 11 | Validator.prototype.doValidate = function(eleName, validateObj){ 12 | let self = this; 13 | let value = self.parent.querySelector('[name=' + eleName + ']').value.replace(/(^\s*)|(\s*$)/g, ''); 14 | // 判断必填选项 15 | if(validateObj.required){ 16 | if(/\S/.test(value)){ 17 | self.setTrue(eleName); 18 | }else{ 19 | self.setFalse(eleName, validateObj.msg); 20 | return; 21 | } 22 | } 23 | // 判断是否与某值相等 24 | if (validateObj.equal) { 25 | let equalValue = self.parent.querySelector('[name=' + validateObj.equal.name + ']').value.replace(/(^\s*)|(\s*$)/g, ''); 26 | if (value === equalValue) { 27 | self.setTrue(eleName); 28 | }else{ 29 | self.setFalse(eleName, validateObj.equal.msg); 30 | return; 31 | } 32 | } 33 | // 判断范围 34 | if(validateObj.scopes && !isNaN(value)){ 35 | for(let j in validateObj.scopes){ 36 | if(validateObj.scopes[j].min){ 37 | if(validateObj.scopes[j].min <= Number(value)){ 38 | self.setTrue(eleName); 39 | }else{ 40 | self.setFalse(eleName, validateObj.scopes[j].msg); 41 | return; 42 | } 43 | } 44 | if(validateObj.scopes[j].max){ 45 | if(validateObj.scopes[j].max >= Number(value)){ 46 | self.setTrue(eleName); 47 | }else{ 48 | self.setFalse(eleName, validateObj.scopes[j].msg); 49 | return; 50 | } 51 | } 52 | } 53 | } 54 | // 判断正则选项 55 | if(validateObj.patterns){ 56 | for(let i in validateObj.patterns){ 57 | if(validateObj.patterns[i].reg.test(value)){ 58 | self.setTrue(eleName); 59 | }else{ 60 | self.setFalse(eleName, validateObj.patterns[i].msg); 61 | return; 62 | } 63 | } 64 | } 65 | }; 66 | 67 | 68 | // 触发验证 69 | Validator.prototype.validate = function(eleId){ 70 | // 如果存在id,只验证此id,否则验证全部 71 | if(eleId){ 72 | for(let k in arguments){ 73 | this.validation[arguments[k]] = {valid: false, msg: ''}; 74 | this.doValidate(arguments[k], this.options[arguments[k]]); 75 | } 76 | 77 | }else{ 78 | for(let i in this.options){ 79 | this.validation[i] = {valid: false, msg: ''}; 80 | this.doValidate(i, this.options[i]); 81 | } 82 | } 83 | // 计算最终结果的唯一标识 84 | for(let j in this.validation){ 85 | if(typeof this.validation[j] === 'object'){ 86 | if(this.validation[j].valid){ 87 | this.validation.valid = true; 88 | this.validation.msg = ''; 89 | }else{ 90 | this.validation.valid = false; 91 | this.validation.msg = this.validation[j].msg; 92 | break; 93 | } 94 | } 95 | } 96 | this.isPass = this.validation.valid; 97 | }; 98 | 99 | 100 | // 相关方法 101 | Validator.prototype.setTrue = function (eleName){ 102 | this.validation[eleName].valid = true; 103 | this.validation[eleName].msg = ''; 104 | }; 105 | Validator.prototype.setFalse = function (eleName, msg){ 106 | this.validation[eleName].valid = false; 107 | this.validation[eleName].msg = msg; 108 | }; 109 | --------------------------------------------------------------------------------