表单验证中时间起止判断的递归处理
作者: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;
}
}
猜你喜欢
- SQLSTATESQL SERVER 驱动程序错误描述 HY000所有绑定列都是只读的。必须是可升级的列,以使用 SQLSetPos 或 S
- 为某国税局开发一综合 * ,需要建立一个庞大的国税系统通讯录数据库,从各省、市到每名具体工作人员,项目较多,该如何设计各表呢?数据库的表设计
- Oracle游标分为显示游标和隐式游标。显示游标(Explicit Cursor):在PL/SQL程序中定义的、用于查询的游标称作显示游标。
- 在使用操作XML文件时,我们可以使用Load方法直接加载xml文件即可,在ie和ff下通用。但是是XML字符串,则在两种浏览器下就会有所不同
- 1.5 学习ASP.net 的过程中如何求助--加入 ASPNG 讨论列表 Charles Carroll 作为不断壮大的 ASP.NET
- 许多网站缺乏针对性和友好的导航设计,难以找到连接到相关网页的路径,也没有提供有助于让访客/用户找到所需信息的帮助,用户体验非常糟糕。本期薯片
- 欣赏上一篇:用画为5.12地震受灾同胞们祈福 今年我们的祖国多灾多难 雪灾的阴影还没散去又发生了地震。中国插画 * 举办5.12地震祈幅绘画活
- 这个话题是应腾讯ISD同仁之邀在WebReBuild三周年交流会上做的主题分享。由于临场等原因有些问题当时没有讲明白,回来后按原有思路形成了
- 在讲样式表开发管理之前,我想插播一个小知识。前几天看web标准设计组里,看到龍佑康同学问到关于 block 和 inline 的区别。记得以
- 记住:这时候08安装的时候要自定义一个实例 比如:mysql2008(不能在使用默认实例了) sql server 2008 express
- 表单递交合法性检测-只接受数字。如下代码加入HTML的<head>区:<SCRIPT LANGUAGE=&quo
- 昨晚着手给个人博客增加网易微博的调用,在Opera下却出现了一个意想不到的问题。内容的展示,一开始是做成横向不间断滚动(现在已经改成纵向定时
- 此站:http://www.cbmland.com/ 的页面离开时的效果非常NB!佩服的很。一开始,我以为是用事件 onunload,试了一
- 今天淘到的,终于可以放心的使用IE7了,再也不用换回IE6做测试了!因为这个10M大小的软件已经包含了从IE3到IE6的版本,安装过程中可以
- 有效地加载数据有时我们需大量地把数据加载到数据表,采用批量加载的方式比一个一个记录加载效率高,因为MySQL不用每加载一条记录就刷新一次索引
- 使用SQL SERVER的[导入]功能,便可将access数据转换,但要注意原来的'自增字段'需要修改,将相应字段标识修改为
- 创作思路:主要还是想尝试做点稍微不同于整天为迎合客户而做的东西.然后闲时就开始构思,比如坐车,走路什么的.看到有一些复古手机的相关图,就想到
- ASP中从数据库读取二进制文件数据代码:<%driver_name1="DRIVER={Microsoft&n
- 去听了牛人 dbaron 的一个 Web Page Layout/Display in Mozilla 讲座( via )。讲的东西对我一个
- 内容摘要:除了内部性能增强和优化外,IIS6.0版本的 Active Server Pages(ASP)&nb