表单验证中时间起止判断的递归处理
作者:dishuipiaoxiang 来源:denis博客 发布时间:2009-12-16 19:27:00
在最近一个项目中,表单验证需要对时间的起止范围进行判断:结束时间需大于或等于开始时间。即:结束年须大于起始年;如果相等,则比较起始月与结束月;如果起止月也相等,则比较日期。那么,对于每一次验证,可以用下面这个函数来进行比较。
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;
}
}
到此验证函数已经完成,但需要注意的是:
虽然没有确定参数的个数,但参数的顺序还是重要的,因为前一个参数的验证结果决定了下一个参数的验证是否继续;
parseInt()函数的第二个参数10不要忽略。如果忽略,当遇到以0开始的数值(如07、08)时将会按八进制进行处理。
到此已经结束,看看 示例:validate-range.htm 。有时候,我们不想以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;
}
}


猜你喜欢
- 在服务器端asp程序可以接受html页面上的form传来的参数,那么它又如何实现IE地址参数判断呢?当地址栏没有参数"id"时
- 单页应用程序是或多或少复杂的应用程序,它加载一个单一的HTML页面。每当用户与它们互动时,它们就会使用JavaScript动态地更新其内容。
- 1 简介kepler.gl作为开源地理空间数据可视化神器,也一直处于活跃的迭代开发状态下。而在前不久,kepler.gl正式发布了其2.4.
- 1,System.ComponentModelSystem.ComponentModel 命名空间提供用于实现组件和控件的运行时和设计时行为
- 如下所示:# coding:utf-8import shapefilew = shapefile.Writer()w.autoBalance
- NumPy数组是一个多维数组对象,称为ndarray创建一个numpy数组,如下所示import numpy as npx=np.array
- 前言最近在做一个人脸识别的项目,需要用数据库保存学生信息与前段交互。MySQL的优点1、mysql性能卓越,服务稳定,很少出现异常宕机。2、
- 1.Word文档如下:2.代码# -*- coding: UTF-8 -*-from docx import Documentdef rea
- 关于数据库的逻辑设计,是一个很广泛的问题。本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以
- 本文实例讲述了Python 实现的微信爬虫。分享给大家供大家参考,具体如下:单线程版:import urllib.requestimport
- 本文实例讲述了python中Genarator函数用法。分享给大家供大家参考。具体如下:Generator函数的定义与普通函数的定义没有什么
- MySQL多表查询添加练习表-- 用户表(user)CREATE TABLE `user`(`id` INT AUTO_INCREMENT
- 最近尝试把项目迁移到Python环境下,特别新装了一台干净的Debian系统,准备重新配置环境,上网找了一些运行Python Web的环境方
- Numpy是高性能科学计算和数据分析的基础包,里面包含了许多对数组进行快速运算的标准数学函数,掌握这些方法,能摆脱数据处理时的循环。1.首先
- QueueQueue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生
- import timedef block(file,size=65536): while True:&n
- 轮廓概述轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 
- <?php //设置我们将要使用的文件 $srcurl = "http://localhost/index.php"
- 一、前言 需求是获取某个时间范围内每小时数据和上小时数据的差值以及比率
- 本文为大家分享了Python3实现发送QQ邮件功能:html,供大家参考,具体内容如下之前已经成功发送了qq邮件。下面贴出html格式的qq