当前位置: 首页 > 图文教程 > 网络编程 > Javascript > 表单验证中时间起止 如何做到递归处理

Javascript
jQuery代码:jQuery控制表单里的回车键
用DIV完美模拟createPopup 弹出窗口(脚本之家修正版),支持Firefox,ie,chrome
jQuery Flash/MP3/Video多媒体插件
9个JavaScript评级/投票插件
JS实现的radio图片选择按钮效果
IE中checkbox在刷新后初始化的问题
JavaScript 学习笔记(十一)
JS 对象介绍
javascript 哈希表(hashtable)的简单实现
jquery 防止表单重复提交代码
js parsefloat parseint 转换函数
javascript parseInt与Number函数的区别
JavaScript 学习笔记(十二) dom
JavaScript 学习笔记(十三)Dom创建表格
javascript 实现自由落体的方块效果
javascript 获取url参数和script标签中获取url参数函数代码
JAVASCRIPT style 中visibility和display之间的区别
javascript 拖放效果实现代码
jquery last-child 列表最后一项的样式
Jquery实战_读书笔记1—选择jQuery

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-03   浏览: 80 ::
收藏到网摘: n/a

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

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

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