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

Javascript
javascript innerText和innerHtml应用
图像替换新技术 状态域方法
JavaScript 判断判断某个对象是Object还是一个Array
Extjs 几个方法的讨论
JavaScript 学习笔记(十五)
javascript 匿名函数的理解(透彻版)
Jquery 常用方法经典总结
jquery 批量上传图片实现代码
javascript中的array数组使用技巧
详细讲解JS节点知识
javascript让setInteval里的函数参数中的this指向特定的对象
javaScript 关闭浏览器 (不弹出提示框)
对字符串进行HTML编码和解码的JavaScript函数
javascript 三种编解码方式
js左侧多级菜单动态的解决方案
JavaScript 学习笔记(十六) js事件
JavaScript面向对象之静态与非静态类
javascript两段代码,两个小技巧
js中鼠标滚轮事件详解(firefox多浏览器)
js实现的仿Photoshop鼠标滚轮控制输入框取值(修正兼容Chrome)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-03   浏览: 59 ::
收藏到网摘: 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