我试图为一个微小的验证系统创建一个jquery插件,所以我在我的函数中有这部分代码
// prevent current form submitting
this.on('submit',function(e){
// remove classes from input when we focus on it
$(this).on('click','input,select',function(){
$(this).removeClass(settings.class);
});
// prevent form from being submited
e.preventDefault();
// find all inputs
$(this).find('input,select').each(function() {
if (!$(this).data('rules')) return;
// get rules array from the attribute
var rules = $(this).data("rules").split(" ");
// foreach rules
for(var i = 0; i < rules.length;i++){
// check if the validation is true or attach the given class to the input
if(validate( rules[i],$(this))){
// the validation is okey continue to the next rule
continue;
}else{
// the validation is false , attach the class to the input and stop the loop
$(this).addClass(settings.class);
break;
}
}
});
});
/* validation */
function validate(rule,input){
switch(rule){
case 'email': return patterns.email.test(input.val()); break;
case 'required': return patterns.required.test(input.val()); break;
case 'url': return patterns.url.test(input.val()); break;
case 'phone': return patterns.phone.test(input.val()); break;
case 'confirmed':
inputName = input.attr('name').split("_confirmation")[0];
return (input.val() == $('input[name='+inputName+']').val() ? true : false);
break;
case /^min\:[0-9]+/.test(rule):
length = rule.split('min:')[1];
return (input.val().trim() >= length ? true : false);
break;
case rule.match(/^max\:[1-9]+/)[0]:
length = rule.split('max:')[1];
return (input.val().trim().length <= length ? true : false);
break;
case rule.match(/^exact\:[1-9]+/)[0]:
length = rule.split('exact:')[1];
return (input.val().trim().length == length ? true : false);
break;
default:
return true;
}
}
/* Patterns */
var patterns = {
email:/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i,
required:/^[\s\t\r\n]*\S+/,
url:/(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/,
phone:/^[0-9]{10,10}$/,
}
当我尝试使用此验证min验证两个输入时:length max:length 它返回rule.match(...)为null, 但是当我尝试使用min:length验证只有一个输入时,它可以正常工作。 有什么帮助吗?
答案 0 :(得分:0)
因为你的switch
。 rule
是string
,您的案例陈述为regex
。试试这个: -
/* validation */
function validate(rule,input){
switch(rule){
case 'email': return patterns.email.test(input.val()); break;
case 'required': return patterns.required.test(input.val()); break;
case 'url': return patterns.url.test(input.val()); break;
case 'phone': return patterns.phone.test(input.val()); break;
case 'confirmed':
inputName = input.attr('name').split("_confirmation")[0];
return (input.val() == $('input[name='+inputName+']').val() ? true : false);
break;
default:
if(/^min\:[0-9]+/.test(rule)){
length = rule.split('min:')[1];
return (input.val().trim().length >= length ? true : false);
}
if(/^max\:[1-9]+/.test(rule)){
length = rule.split('max:')[1];
return (input.val().trim().length <= length ? true : false);
}
if(/^exact\:[1-9]+/.test(rule)){
length = rule.split('exact:')[1];
return (input.val().trim().length == length ? true : false);
}
return true;
}
}
工作Fiddle
答案 1 :(得分:0)
问题是如果模式不匹配,rule.match(/^max\:[1-9]+/)[0]
将导致错误。在这种情况下,.match()
会返回null
并且访问[0]
会失败。
max:10
在您的示例中不起作用的另一个原因是[1-9]
没有包含0
,因此10
赢了&#39}。匹配。
对这两个问题的快速解决方法是将表达式更改为rule.match(/^(max\:[0-9]+)|.*/)[1]
。