文章探索:   分类:    关键字:  
  + 栏目导航
  + 相关文章
document 对象
Window.Open详解
JS replace 方法
JScript 属性
JScript 对象
JScript 方法
关于window.opener的用法
JavaScript语法——style.display 属..
不被拦截的弹出窗口代码
showModalDialog和showModelessDialog..
showModelessDialog()使用详解
IE中非模式对话框(showModelessDialog..
JS eval()函数
Preferences 指南
JS中的setTimeout和setInterval的区别
JavaScript对象与数组参考大全
javascript动态增加、删除、填充表格..
用Java实现几种常见的排序算法
JavaScript 日期函数
JavaScript 使用字符串函数
如何用Javascript获得TextArea中的光..
Document 对象方法
在input中只能输入数字
selection.createRange() 用法例子
获取网页各种宽高的值
JavaScript方法 - indexOf方法
substring函数详解
40种网页常用小技巧(javascript)
event.X和event.clientX有什么区别
clientX, clientY,offsetX, offsetY,..


技术教程 -> JavaScript教程 ->  
javascript实现通用表单验证函数
来源:转载   人气:742   录入时间:2007-11-8
    不管是动态网站,还是其它B/S结构的系统,都离不开表单
   表单做为客户端向服务器提交数据的载体担当相当重要的角色.
   这就引出了一个问题,提交的数据合法吗?摆在我们面前的问题就是验证这些数据
   保证所提交的数据是合法的.所以,我们写了一个大堆的验证函数.当我们开始新的一个
   项目的开发时,我们又得写一大堆的验证函数,然后再调试这一大堆的函数...
   
   本文将介绍一种方法来提高我的代码的可重用性,提高我们的开发效率.
   
   个人以为表单的验证应该包含两部分:
   第一,判断用户输入的数据是否合法.
   第二,提示用户你的数据为什么是不合法的.
   
   所以,我们的通用表单验证函数要实现的功能就是:
   第一,取得用户输入的数据GetValue(el)
   第二,验证用户的数据CheckForm(oForm)
   IE支持自定义属性,这就是这个通用函数实现的基础
   我们可以在表单元素上加入描述自身信息的属性.有点像XML吧.
   check属性:该属性用于存储数据合法性的正则表达式.
   warning属性:该性性用于存储出错误提示信息.
   第三,返回有误的表单提示GoBack(el)
   这三个步骤的触发事件是onsubmit,记住是return CheckForm(this)
   搞错了就全功尽弃了 :)
   <form onsubmit="return CheckForm(this)">
   
   写到这里,整体框架就出来了,通过取得表单元素的check属性,取得字符串,构建正则表达式.再验证其值.如果通过验证就提交,如是数据不合法则取得表单元素的warning属性,产生提示信息.并返回到该表单元素.整个的框架也比较简单.
   我们要做的就是写好正则表达式!
   
   接下来我们来分析一下所有的表单元素
   按其共性,我们将它们分为三类
   每类表单的特点不一样,我们的目标就是写出通用的.
   
   1.文输入框Text
   <input type="text" name="txt">
   <input type="password" name="pwd">
   <input type="hidden" name="hid">
   <input type="file" name="myfile">
   <textarea name="txts"></textarea>
   2.单多选框Choose
   <input type="checkbox" name="c">
   <input type="checkbox" name="c">
   <input type="radio" name="r">
   <input type="radio" name="r">
   3.单多下拉菜单Select
   <select name="sel"></select>
   <select name="sels" multiple></select>
   
   
   讲了一堆"大道理"太抽象了,代码更有说服力!
   
   Check.js JS函数文件
   ////////////////////////////////////////////////////////////////////////////////
   /*
    *--------------- 客户端表单通用验证CheckForm(oForm) -----------------
    * 功能:通用验证所有的表单元素.
    * 使用:
    * <form name="form1" onsubmit="return CheckForm(this)">
    * <input type="text" name="id" check="^S+$" warning="id不能为空,且不能含有空格">
    * <input type="submit">
    * </form>
    * author:wanghr100(灰豆宝宝.net)
    * email:wanghr100@126.com
    * update:19:28 2004-8-23
    * 注意:写正则表达式时一定要小心.不要让"有心人"有空子钻.
    * 已实现功能:
    * 对text,password,hidden,file,textarea,select,radio,checkbox进行合法性验证
    * 待实现功能:把正则表式写成个库.
    *--------------- 客户端表单通用验证CheckForm(oForm) -----------------
    */
   ////////////////////////////////////////////////////////////////////////////////
   
   //主函数
   function CheckForm(oForm)
   {
    var els = oForm.elements;
    //遍历所有表元素
    for(var i=0;i<els.length;i++)
    {
    //是否需要验证
    if(els[i].check)
    {
    //取得验证的正则字符串
    var sReg = els[i].check;
    //取得表单的值,用通用取值函数
    var sVal = GetValue(els[i]);
    //字符串->正则表达式,不区分大小写
    var reg = new RegExp(sReg,"i");
    if(!reg.test(sVal))
    {
    //验证不通过,弹出提示warning
    alert(els[i].warning);
    //该表单元素取得焦点,用通用返回函数
    GoBack(els[i])
    return false;
    }
    }
    }
   }
   
   //通用取值函数分三类进行取值
   //文本输入框,直接取值el.value
   //单多选,遍历所有选项取得被选中的个数返回结果"00"表示选中两个
   //单多下拉菜单,遍历所有选项取得被选中的个数返回结果"0"表示选中一个
   function GetValue(el)
   {
    //取得表单元素的类型
    var sType = el.type;
    switch(sType)
    {
    case "text":
    case "hidden":
    case "password":
    case "file":
    case "textarea": return el.value;
    case "checkbox":
    case "radio": return GetValueChoose(el);
    case "select-one":
    case "select-multiple": return GetValueSel(el);
    }
    //取得radio,checkbox的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
    function GetValueChoose(el)
    {
    var sValue = "";
    //取得第一个元素的name,搜索这个元素组
    var tmpels = document.getElementsByName(el.name);
    for(var i=0;i<tmpels.length;i++)
    {
    if(tmpels[i].checked)
    {
    sValue += "0";
    }
    }
    return sValue;
    }
    //取得select的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
    function GetValueSel(el)
    {
    var sValue = "";
    for(var i=0;i<el.options.length;i++)
    {
    //单选下拉框提示选项设置为value=""
    if(el.options[i].selected && el.options[i].value!="")
    {
    sValue += "0";
    }
    }
    return sValue;
    }
   }
   
   //通用返回函数,验证没通过返回的效果.分三类进行取值
   //文本输入框,光标定位在文本输入框的末尾
   //单多选,第一选项取得焦点
   //单多下拉菜单,取得焦点
   function GoBack(el)
   {
    //取得表单元素的类型
    var sType = el.type;
    switch(sType)
    {
    case "text":
    case "hidden":
    case "password":
    case "file":
    case "textarea": el.focus();var rng = el.createTextRange(); rng.collapse(false); rng.select();
    case "checkbox":
    case "radio": var els = document.getElementsByName(el.name);els[0].focus();
    case "select-one":
    case "select-multiple":el.focus();
    }
   }
   
   
   
   
   demo.htm 演示文件
   
   <script language="JavaScript" src="Check.js"></script>
   通用表单函数测试:
   <form name="form1" onsubmit="return CheckForm(this)">
   test:<input type="text" name="test">不验证<br>
   账号:<input type="text" check="^S+$" warning="账号不能为空,且不能含有空格" name="id">不能为空<br>
   密码:<input type="password" check="S{6,}" warning="密码六位以上" name="id">六位以上<br>
   电话:<input type="text" check="^d+$" warning="电话号码含有非法字符" name="number" value=""><br>
   相片上传:<input type="file" check="(.*)(.jpg|.bmp)$" warning="相片应该为JPG,BMP格式的" name="pic" value="1"><br>
   出生日期:<input type="text" check="^d{4}-d{1,2}-d{1,2}$" warning="日期格式2004-08-10" name="dt" value="">日期格式2004-08-10<br>
   省份:
   <select name="sel" check="^0$" warning="请选择所在省份">
   <option value="">请选择
   <option value="1">福建省
   <option value="2">湖北省
   </select>
   <br>
   选择你喜欢的运动:<br>
   游泳<input type="checkbox" name="c" check="^0{2,}$" warning="请选择2项或以上">
   篮球<input type="checkbox" name="c">
   足球<input type="checkbox" name="c">
   排球<input type="checkbox" name="c">
   <br>
   你的学历:
   大学<input type="radio" name="r" check="^0$" warning="请选择一项学历">
   中学<input type="radio" name="r">
   小学<input type="radio" name="r">
   <br>
   个人介绍:
   <textarea name="txts" check="^[s|S]{20,}$" warning="个人介绍不能为空,且不少于20字"></textarea>20个字以上
   <input type="submit">
   </form>
   
   
   
   
   
   JS判断两种格式的输入日期的正确性
   
   最简单的
   
    function isValidDate(dateStr) {
    var matchArray = dateStr.match(/^[0-9]+-[0-1][0-9]-[0-3][0-9]$/)
    if (matchArray == null) {
    alert("Invalid date: " + dateStr);
    return false;
    }
    return true;
    }
   
   第二种
   <script language=javascript>
   String.prototype.isDate = function()
   {
    var r = this.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
    if(r==null)return false; var d = new Date(r[1], r[3]-1, r[4]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
   }
   alert("2002-01-31".isDate());
   alert("2002-01-41".isDate());
   </script>
   第三种,比较复杂的
   <script language=javascript>
   String.prototype.isTime = function()
   {
    var r = this.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/);
    if(r==null)return false; var d = new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
   }
   alert("2002-1-31 12:34:56".isTime());
   alert("2001-2-29 12:54:56".isTime());
   alert("2002-1-41 12:00:00".isTime());
   </script>
   判断数字用 isNaN()
   
   




Copyright(C)2007-2024 广州市佳沛数码科技有限公司 版权所有
公司地址: 广州市荔湾区东漖北路560号511室
电话:020-81803473 传真:020-81544987