表单验证中时间起止判断的递归处理

在最近一个项目中,表单验证需要对时间的起止范围进行判断:结束时间需大于或等于开始时间。即:结束年须大于起始年;如果相等,则比较起始月与结束月;如果起止月也相等,则比较日期。那么,对于每一次验证,可以用下面这个函数来进行比较。

function compare(begin,end,error){
	var begin = parseInt(begin,10);
	var end = parseInt(end,10);
	var diff = end - begin;
	if(diff < 0){
		alert(error);
	}else{
		return true;
	}
}

这样,在验证的时候,只要结果返回真就表示通过。如:

	var year = compare(2001,2003,'年');
	var month = compare(1,2,'月');
	var day = compare(12,13,'天');
	alert(year && month && day); //结果为真------"true"

将上面的起止月份和起止日期修改一下。如:

	var year = compare(2001,2003,'年');
	var month = compare(3,2,'月');
	var day = compare(24,13,'天');
	alert(year && month && day); /结果为假------"false"

执行结果,依次显示"月","天","false";实际上,当起止月份不正确的时候,我们没必要对日期进行验证;月份验证的前提条件是年验证通过;天验证的前提是月份验证通过。仔细分析之后,我决定将上面函数的三个参数用单体模式存储起来,即:

	{
		begin:2001,
		end:2003,
		error:"结束年限须大于起始年限"
	}

但是,我又不想定义函数的参数,函数能否根据传递的参数自动进行验证了?答案是肯定的。在函数的开始,先判断参数的个数,如果大于1,则含有递归处理。如何做到递归处理呢?我在函数内部作了如下处理:

	var len = arguments.length;
	if(len > 1){
		var args = Array.prototype.slice.call(arguments);
		args.shift(); //将第一个参数移除,余下的用作递归处理的参数
	}

对于arguments,我们不能直接调用Array.shift()方法。虽然arguments有length属性,但毕竟不是数组,所以用Array.slice()方法将其转换成数组。关于arguments,在网上可以了解到更多的信息,这里不在赘述。为什么只有在len大于1时才进行处理呢?因为参数为1时,就不需要进行下一步验证了。递归处理在什么时候进行呢?仔细想想,只有在初始值与结束值相等时才需要,明白了这些,我们就很容易构建我们的验证函数了。

	var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
	if(diff <0 ){
		alert(arguments[0].error);
		return false;
	}else if(diff == 0){
		return len > 1 ? arguments.callee.apply(this,args) : true;
	}else{
		return true;
	}

上面的代码中,arguments.callee是函数自身,关于apply的用法可以在web查找相关资料。

完整代码如下:

function compare(){
	var len = arguments.length;
	if(len > 1){
		var args = Array.prototype.slice.call(arguments);
		args.shift(); //将第一个参数移除,余下的用作递归处理的参数
	}
	var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
	if(diff <0 ){
		alert(arguments[0].error);
		return false;
	}else if(diff == 0){
		return len > 1 ? arguments.callee.apply(this,args) : true;
	}else{
		return true;
	}
}

到此验证函数已经完成,但需要注意的是:

  1. 虽然没有确定参数的个数,但参数的顺序还是重要的,因为前一个参数的验证结果决定了下一个参数的验证是否继续;
  2. parseInt()函数的第二个参数10不要忽略。如果忽略,当遇到以0开始的数值(如07、08)时将会按八进制进行处理。

到此已经结束,看看示例 。有时候,我们不想以alert的方式显示错误信息,我们可以自定义处理函数将其作为最后一个参数传入其中。那么在函数的开始,取得处理函数,如:

	var func = arguments[len - 1];
	if(typeof  func  ==  'function'){
	func(arguments[0]);
	}

所以,最终的处理函数是这样的:

function compare(){
	var len = arguments.length;
	var func = arguments[len - 1];
	if(len > 1){
		var args = Array.prototype.slice.call(arguments);
		args.shift(); //将第一个参数移除,余下的用作递归处理的参数
	}
	var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
	if(diff <0 ){
		(typeof  func  ==  'function') ? func(arguments[0].error) : alert(arguments[0].error);
		return false;
	}else if(diff == 0){
		return len > 1 ? arguments.callee.apply(this,args) : true;
	}else{
		return true;
	}
}

转载地址:http://www.denisdeng.com/?p=631

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值