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

2016-02-20 01:10 14 1 收藏

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

【 tulaoshi.com - Web开发 】

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

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

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://www.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的方式显示错误信息,我们可以自定义处理函数将其作为最后一个参数传入其中。那么在函数的开始,取得处理函数,如:

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

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

来源:http://www.tulaoshi.com/n/20160220/1633418.html

延伸阅读
男人如何做到健康剃须 男人如何做到健康剃须 剃须温馨提示: 1、无论是哪种剃须方式,刮后的部位都有些肉眼看不见的伤痕。而剃须膏、剃须泡沫之类的产品中大多含有薄荷香和消炎药物,在脸上产生泡沫软化胡须后开始剃须,这样既有方便剃须和舒缓脸部皮肤的作用,又能有效地防止细菌感染。现在大多数人都用着电动剃须刀...
番茄加柠檬自然美白脸。 柠檬和番茄能有效减轻皮肤的颜色,常常用来美白皮肤。首先,准备两个大碗,第一个碗用来装番茄,将西红柿捣碎和?茶匙柠檬汁混合,然后把它们涂抹在你的面部和颈部,保持20分钟,让皮肤充分吸收,后用清水洗干净皮肤。 使用防晒霜美白脸部肌肤。 上午10点到下午3点是太阳光最强烈的时间段,确保你不被...
标签: 分娩
孕妇如何做到防止早产     相信孕妈妈们都希望自己的宝宝可能足月出生,健健康康的长大的,所以避免早产的出现,是怀孕妈妈们一定要了解的知识了。那么,孕妇到底如何避免早产呢?下面我们就一起了解下吧。         1、全面的孕前检查。      在准爸妈们决定要孩子的时...
标签: Web开发
不像域级有效性检查(field-level validation),表单级有效性检查(form-level validation)将整个表单上的某组(或全部)值作为一个整体分析其一致性。表单级有效性检查一般发生在将一个已完成的Html 表单提交给CGI 程序之前。我们这样做是为了确保用户在将数据发送至服务器之前,已经填写了所有的必填域。 验证整个表单其实相当简...
标签: Web开发
这里所谓的复杂表单,是指表单中包含多种不同的输入类型,比如下拉列表框、单行文本、多行文本、数值等。在经常需要更换这类表单的场合,需要有一个表单的动态生成程序。本文介绍的正是这样一个系统,它以数据库保存表单定义数据,利用ASP脚本动态生成表单HTML代码以及验证表单输入的脚本。 一、定义数据库表结构 在Web上经常可...

经验教程

313

收藏

68
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部