var strategies={
isNonEmpty:function(value,errorMsg){
if(value===""){
return errorMsg;
}
},
minLength:function(value,length,errorMsg){
if(value.length<length){
return errorMsg;
}
},
isMoblie:function(value,errorMsg){
if(!/(^1[3|5|8][0-9]$)/.test(value)){
return errorMsg;
}
}
}
var Validator=function(){this.cache=[];};
Validator.prototype.add=function(dom,rule,errorMsg){
var ary=rule.split(":");
this.cache.push(function(){
var strategy=ary.shift();
ary.unshift(dom.value);
ary.push(errorMsg);
//1、这下面的return返回的是什么意思
//2、strategies这个对象下没有这个[strategy]属性吧,
return strategies[strategy].apply(dom,ary);
});
};
Validator.prototype.start=function(){
//3、这个循环validatorFunc是变量他里面好像也没用到他吧,
// 这个validatorFunc变量是下面这个validatorFunc()吗??
// 下面的 validatorFunc()是调用的方法来的吧??
for(var i=0,validatorFunc;validatorFunc=this.cache[i++];){
var msg=validatorFunc();
if(msg){
return msg;
}
}
};
var validataFunc=function(){
var validator=new Validator();
validator.add(registerForm.userName,"isNonEmpty","用户名不能为空");
validator.add(registerForm.password,"minLength:6","密码长度不能小于6位");
validator.add(registerForm.phoneNumber,"isMobile","手机号码格式不正确");
var errorMsg=validator.start();
return errorMsg;
}
var registerForm=document.getElementById("registerForm");
registerForm.onsubmit=function(){
var errorMsg=validataFunc();
if(errorMsg){
alert(errorMsg);
return false;
}
}
----html-----
<form action="http://www.xxx.com" id="registerForm" method="post">
请输入用户名:<input type="text" name="userName" /><br/>
请输入密码:<input type="text" name="password" /><br/>
请输入手机号码:<input type="text" name="phoneNumber" /><br/>
<button>提交</button>
this.cache
是个数组,将一个匿名函数压入这个数组中,所以这个return
是和你问的第三个问题相对应。访问对象的属性有两种方法,一种用
.
,一种是在key
为变量的情况下,采用数组的访问形式。validatorFunc
就是第一点中压入this.cache
的匿名函数,所以,validatorFunc()
是在执行这个匿名函数,那么第一点的return
也就知道了,就是这个匿名函数
的返回值。我不明白的是写成这样有什么好处么?为什么看起来很别扭啊。