表单验证中时间起止 如何做到递归处理

游走在星空下

游走在星空下

2016-02-20 01:10

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享表单验证中时间起止 如何做到递归处理教程,希望对大家能有一点小小的帮助。

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

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

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;
    }
}

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

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

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;
    }
}

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

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

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

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

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

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

展开更多 50%)
分享

猜你喜欢

表单验证中时间起止 如何做到递归处理

Web开发
表单验证中时间起止 如何做到递归处理

在日常护理中如何做到补水?

皮肤护理
在日常护理中如何做到补水?

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

如何做到美白

电脑网络
如何做到美白

如何做到举止优雅

生活常识
如何做到举止优雅

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何做到温柔断奶?

育儿知识
如何做到温柔断奶?

Javascript 验证表单插件

Web开发
Javascript 验证表单插件

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Windows7系统任务栏时间区域显示农历

Windows7系统任务栏时间区域显示农历

NETKING网络监控管理系统如何过滤网页URL地址

NETKING网络监控管理系统如何过滤网页URL地址
下拉加载更多内容 ↓