考虑到表单验证,我只想要一些简单的、工作的、可扩展的东西。
我想出了下面的代码,它需要一个选择器列表,它映射到执行验证的一个或多个函数。成功时,验证器函数返回一个"falsey“值(最好是空字符串或false ),如果成功,它将返回错误文本。最后的结果是从所有输入到它们产生的一个或多个错误的映射。
欢迎对风格和良好实践的任何评论,以及对ES-6功能的良好使用。
export default function validateForm(form, rules, baseSelector = 'input,textarea') {
let inputs = form.querySelectorAll(baseSelector);
let errorMap = new Map();
for (let input of inputs) {
errorMap.set(input, validateInput(input, rules));
}
return errorMap;
}
function validateInput(input, rules) {
let errors = [];
for (let rule of Object.keys(rules)) {
if (input.matches(rule)) {
let e = validateRule(input, rules[rule]);
errors.push(...e);
}
}
return errors;
}
function validateRule(input, validators) {
// In case only a single function is provided instead of an array
if (typeof validators === 'function') {
validators = [validators];
}
return validators
.map(validate => validate(input))
.filter(result => !!result);
}样例呼叫:
function ensureRequired(input) {
if (!input.required || input.value) {
return '';
}
return 'required field not set';
}
function ensureNumber(input) {
if (Number.isInteger(input.value)) {
return '';
}
return 'field must be number';
}
let myForm = document.getElementById('myForm');
let validationResult = validateForm(myForm, {
'input': ensureRequired,
'input.phoneField': [ensureNumber]
};免责声明:我知道HTML5已经内置了表单验证,我有意避免使用它。
发布于 2017-10-27 19:08:24
以下是我的想法:
validationResult的使用方式,可以使用POJO代替Map来使用更少的内存,尽管这可能不是问题。POJO不像.forEach那样具有地图 (尽管可以迭代POJO的键)。显然在使用符合ES-2015标准的引擎时,键顺序保持不变.querySelectorAll(),但这可能只会带来轻微的性能提高。https://codereview.stackexchange.com/questions/178243
复制相似问题