1. 程式人生 > >轉帖:客戶端表單通用驗證checkForm(oForm) js版

轉帖:客戶端表單通用驗證checkForm(oForm) js版

////////////////////////////////////////////////////////////////////////////////
/*
 *--------------- 客戶端表單通用驗證checkForm(oForm) -----------------
 * 本程式最初是由wanghr100(灰豆寶寶.net)的checkForm基礎上進行修改的,增加了很多功能,如下:
 * 1.對非ie的支援
 * 2.增加了內建表示式和內建提示
 *  3.增加了顯示方式(彈出式和頁面顯示式)
 * 4.增加了顯示一條和顯示全部
 * 5.進行了封裝(CLASS_CHECK)
 * 6.支援外接函式或表示式(應用在密碼一致)
 * 7.簡化了呼叫方式,所有操作只需要<script language='javascript' src='checkform.js'>,
   然後在HTML裡定義各標籤驗證格式
 * 8.對IE增加了對鍵盤輸入的限制(如:定義usage='int'時,輸入框只能輸入數字(非IE無效)
 * 9.增加了對disabled的不驗證
 * 10.自定義報警方式(重寫showMessageEx方法)

 *-----------------------------申明資訊-----------------------------
 *
 * 作者: ttyp
 * 郵箱: [email protected]
 * 部落格: http://www.cnblogs.com/ttyp/
 *  宣告: 對本程式可以任意複製傳播,但請保留這些宣告,對於內建的表示式有些沒有做到很嚴格,如果你
   有好的建議和意見,歡迎郵件和我聯絡或者上我的部落格留言

 * 簡介:
   本程式只需要對需要驗證的標籤設定三個屬性:usage,exp,tip

   usage : 內建格式或表示式或函式
   exp  : 正則表示式(注意如果指定了usage則忽略exp)
   tip  : 出錯提示(如果是內建格式可以不要此屬性,有預設提示)

   呼叫時只需要引用<script language='javascript' src='checkform.js'>,然後為每個標記
   增加以上3個屬性(不一定需要全部)

 * 原作者: wanghr100(灰豆寶寶.net)
 * email: [email protected]
 *
 *--------------- 客戶端表單通用驗證checkForm(oForm) -----------------
 */
////////////////////////////////////////////////////////////////////////////////


function CLASS_CHECK()
{
 this.pass  = true;  //是否通過驗證
 this.showAll = true;  //是否顯示所有的驗證錯誤
 this.alert  = false; //報警方式(預設alert報警)
 this.message = "";  //錯誤內容
 this.first  = null;  //在顯示全部驗證錯誤時的第一個錯誤控制元件(用於回到焦點)

 //定義內建格式
 var aUsage =
 {
  "int":"^([+-]?)//d+$",           //整數
  "int+":"^([+]?)//d+$",           //正整數
  "int-":"^-//d+$",            //負整數
  "num":"^([+-]?)//d*//.?//d+$",         //數字
  "num+":"^([+]?)//d*//.?//d+$",         //正數
  "num-":"^-//d*//.?//d+$",          //負數
  "float":"^([+-]?)//d*//.//d+$",         //浮點數
  "float+":"^([+]?)//d*//.//d+$",         //正浮點數
  "float-":"^-//d*//.//d+$",          //負浮點數
                  //郵件
  "email":"^//w+((-//w+)|(//.//w+))*//@[A-Za-z0-9]+((//.|-)[A-Za-z0-9]+)*//.[A-Za-z0-9]+$", 
  "color":"^#[a-fA-F0-9]{6}",          //顏色
  "url":"^http[s]?://////([//w-]+//.)+[//w-]+([//w-./?%&=]*)?$", //聯接
  "chinese":"^[//u4E00-//u9FA5//uF900-//uFA2D]+$",    //僅中文
  "ascii":"^[//x00-//xFF]+$",          //僅ACSII字元
  "zipcode":"^//d{6}$",           //郵編
  "mobile":"^0{0,1}13[0-9]{9}$",         //手機
  "ip4":"^//d{1,3}//.//d{1,3}//.//d{1,3}.//d{1,3}$",    //ip地址
  "notempty":"^//S+$",           //非空
  "picture":"(.*)//.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", //圖片
  "rar":"(.*)//.(rar|zip|7zip|tgz)$",        //壓縮檔案
  "date":"^//d{4}(//-|///|/.)//d{1,2}//1//d{1,2}$"        //日期
 };

 //預設訊息
 var aMessage =
 {
  "int" :"請輸入整數",           //整數
  "int+" :"請輸入正整數",           //正整數
  "int-" :"請輸入負整數",           //負整數
  "num" :"請輸入數字",           //數字
  "num+" :"請輸入正數",           //正數
  "num-" :"請輸入負整數",           //負數
  "float" :"請輸入浮點數",           //浮點數
  "float+":"請輸入正浮點數",          //正浮點數
  "float-":"請輸入負浮點數",          //負浮點數
  "email" :"請輸入正確的郵箱地址",         //郵件
  "color" :"請輸入正確的顏色",          //顏色
  "url" :"請輸入正確的連線地址",         //聯接
  "chinese":"請輸入中文",           //中文
  "ascii" :"請輸入ascii字元",          //僅ACSII字元
  "zipcode":"請輸入正確的郵政編碼",         //郵編
  "mobile":"請輸入正確的手機號碼",         //手機
  "ip4" :"請輸入正確的IP地址",          //ip地址
  "notempty":"不能為空",           //非空
  "picture":"請選擇圖片",           //圖片
  "rar" :"請輸入壓縮檔案",          //壓縮檔案
  "date" :"請輸入正確的日期"          //日期
 }

 var me = this;

 function checkForm(oForm)
 {
  me.pass  = true;
  me.message = "";
  me.first = null;
  var els = oForm.elements;
  //遍歷所有表元素
  for(var i=0;i<els.length;i++)
  {
   //取得格式
   var sUsage = els[i].getAttribute("Usage"); 
   var sReg = "";
   
   //如果設定Usage,則使用內建正則表示式,忽略Exp
   if(typeof(sUsage)!="undefined"&&sUsage!=null)
   {
    //如果Usage在表達室裡找到,則使用內建表示式,無則認為是表示式;表示式可以是函式;
    if(aUsage[sUsage]!=null)
    {   
     sReg = aUsage[sUsage];
    }
    else
    {
     try
     {
      if(eval(sUsage)==false)
      { 
       me.pass  = false;
       if(me.first==null)
       {
        me.first = els[i];
       }

       addMessage(getMessage(els[i]));       

       if(me.showAll==false)
       {
        setFocus(els[i]);
        break;
       }
      }
     }
     catch(e)
     {
      alert("表示式[" + sUsage +"]錯誤:" + e.description)
      return false;
     }
    }
   }
   else
   {   
    sReg = els[i].getAttribute("Exp");
   }

   if(typeof(sReg)!="undefined"&&sReg!=null)
   {
    //對於失效狀態不驗證
    if(isDisabled(els[i])==true)
    {
     continue;
    }

    //取得表單的值,用通用取值函式
    var sVal = getValue(els[i]);
    //字串->正則表示式,不區分大小寫
    var reg = new RegExp(sReg,"i");
    if(!reg.test(sVal))
    {
     me.pass  = false;
     if(me.first==null)
     {
      me.first = els[i];
     }

     //alert(reg);
     //驗證不通過,彈出提示warning
     var sTip = getMessage(els[i]);
     if(sTip.length==0&&typeof(sUsage)!="undefined"&&sUsage!=null&&aMessage[sUsage]!=null)
     {
      sTip = aMessage[sUsage];
     }
     addMessage(sTip);

     if(me.showAll==false)
     {
      //該表單元素取得焦點,用通用返回函式
      setFocus(els[i]);
      break;
     }

    }
   }       
  }

  if(me.pass==false)
  {
   showMessage();

   if(me.first!=null&&me.showAll==true)
   {
    setFocus(me.first);
   }
  }

  return me.pass;
 }

 /*
  * 新增錯誤資訊
  */
 function addMessage(msg)
 {
  if(me.alert==true)
  {
   me.message += msg + "/n";
  }
  else
  {
   me.message += msg + "<br>";
  }
 }

 /*
  * 顯示錯誤
  */
 function getMessage(els)
 {
  var sTip = els.getAttribute("tip");
  if(typeof(sTip)!="undefined"&&sTip!=null)
  {
   return sTip;
  }
  else
  {
   return "";
  }
 }


 /*
  * 顯示錯誤
  */
 function showMessage()
 {
  //外接顯示錯誤函式
  if(typeof(me.showMessageEx)=="function")
  {
   return me.showMessageEx(me.message);
  }

  if(me.alert==true)
  {
   alert(me.message);
  }
  else
  {
   var divTip;
    divTip = document.getElementById("divErrorMessage");
   try
   {
    if(typeof(divTip)=="undefined"||divTip==null)
    {
      divTip = document.createElement("div");
      divTip.id   = "divErrorMessage";
      divTip.name   = "divErrorMessage";
      divTip.style.color = "red";
      document.body.appendChild(divTip);
    }

    divTip.innerHTML = me.message;
   }catch(e){}
  }
 }

 /*
  * 獲得元素是否失效(失效的元素不做判斷)
  */
 function isDisabled(el)
 {
  //對於radio,checkbox元素,只要其中有一個非失效元素就驗證
  if(el.type=="radio"||el.type=="checkbox")
  {
   //取得第一個元素的name,搜尋這個元素組
   var tmpels = document.getElementsByName(el.name);
   for(var i=0;i<tmpels.length;i++)
   {
    if(tmpels[i].disabled==false)
    {
     return false;
    }
   }
   return true;
  }
  else
  {
   return el.disabled;
  }
 }


 /*
  * 取得物件的值(對於單選多選框把其選擇的個數作為需要驗證的值)
  */
 function getValue(el)
 {
  //取得表單元素的型別
  var sType = el.type;
  switch(sType)
  {
   //文字輸入框,直接取值el.value
   case "text":
   case "hidden":
   case "password":
   case "file":
   case "textarea": return el.value;
   //單多下拉選單,遍歷所有選項取得被選中的個數返回結果"0"表示選中一個,"00"表示選中兩個
   case "checkbox":
   case "radio": return getRadioValue(el);
   case "select-one":
   case "select-multiple": return getSelectValue(el);
  }
  //取得radio,checkbox的選中數,用"0"來表示選中的個數,我們寫正則的時候就可以通過0{1,}來表示選中個數
  function getRadioValue(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 getSelectValue(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 setFocus(el)
 {
  //取得表單元素的型別
  var sType = el.type;
  switch(sType)
  {
   //文字輸入框,游標定位在文字輸入框的末尾
   case "text":
   case "hidden":
   case "password":
   case "file":
   case "textarea":
    try{el.focus();var rng = el.createTextRange(); rng.collapse(false); rng.select();}catch(e){};
    break;
   
   //單多選,第一選項非失效控制元件取得焦點
   case "checkbox":
   case "radio":
    var els = document.getElementsByName(el.name);
    for(var i=0;i<els.length;i++)
    {
     if(els[i].disabled == false)
     {
      els[i].focus();
      break;
     }
    }
    break;
   case "select-one":
   case "select-multiple":
    el.focus();
    break;
  }
 }

 
 //自動繫結到所有form的onsubmit事件
 if(window.attachEvent)
 {
  window.attachEvent("onload",function(){for(var i=0;i<document.forms.length;i++){var theFrom = document.forms[i]; if(theFrom){theFrom.attachEvent("onsubmit",function(){return checkForm(theFrom);});}}});
 }
 else
 {
  window.onsubmit = function(e){var theFrom = e.target;if(theFrom){return checkForm(theFrom);}}
 }

 this.keyCheck = function()
 {
  if(window.attachEvent)
  {
   window.attachEvent("onload",function(){for(var i=0;i<document.forms.length;i++){var theFrom = document.forms[i]; if(theFrom){myKeyCheck(theFrom);}}});
  }
  else
  {
   //TOOD
  }

  function myKeyCheck(oForm)
  {
   var els = oForm.elements;
   //遍歷所有表元素
   for(var i=0;i<els.length;i++)
   {
    //取得格式
    var sUsage = els[i].getAttribute("Usage"); 
    
    //如果設定Usage,則使用內建正則表示式,忽略Exp
    if(typeof(sUsage)!="undefined"&&sUsage!=null)
    {
     switch(sUsage.toLowerCase ())
     {
      case "zipcode":
      case "int":
       els[i].onkeypress = function(){return //d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('+')<0?String.fromCharCode(event.keyCode)=="+":false)||(this.value.indexOf('-')<0?String.fromCharCode(event.keyCode)=="-":false);}
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "mobile":
      case "int+":
       els[i].onkeypress = function(){return //d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('+')<0?String.fromCharCode(event.keyCode)=="+":false);}
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "int-":
       els[i].onkeypress = function(){return //d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('-')<0?String.fromCharCode(event.keyCode)=="-":false);}     
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "float":
      case "num":
       els[i].onkeypress = function(){return /[/+/-/.]|/d/.test(String.fromCharCode(event.keyCode));}     
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "float+":
      case "num+":
       els[i].onkeypress = function(){return /[/+/.]|/d/.test(String.fromCharCode(event.keyCode));}     
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "float-":
      case "num-":
       els[i].onkeypress = function(){return /[/-/.]|/d/.test(String.fromCharCode(event.keyCode));}     
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "ascii":
       els[i].style.imeMode= "disabled";
       break;
      case "ip4":
       els[i].onkeypress = function(){return /[/.]|/d/.test(String.fromCharCode(event.keyCode));}     
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].style.imeMode= "disabled";
       els[i].maxLength = 15;
       break;
      case "color":
       els[i].onkeypress = function(){return /[a-fA-Z]|/d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('#')<0?String.fromCharCode(event.keyCode)=="#":false);}     
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].maxLength = 7;
       els[i].style.imeMode= "disabled";
       break;
      case "date":
       els[i].onkeypress = function(){return /[///-/.]|/d/.test(String.fromCharCode(event.keyCode));}     
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(//D/);}
       els[i].ondragenter = function(){return false;}
       els[i].style.imeMode= "disabled";
       break;       
     }
    }
   }
  }
 }
}

//初始化
var g_check = new CLASS_CHECK();
 g_check.keyCheck();

相關推薦

客戶通用驗證checkForm(oForm) js

/////////////////////////////////////////////////////////////////////////////////* *--------------- 客戶端表單通用驗證checkForm(oForm) ------------

『PHP學習筆記』系列九利用from的onSubmit事件進行瀏覽器的資料驗證

資料驗證思路:      當我們在網站進行註冊時,一般有兩個資料驗證的過程,一個是在伺服器端的驗證,一個是在瀏覽器端的驗證。瀏覽器端的驗證一般是用來驗證提交的資訊是否符合註冊的要求,即資料是否合法;伺服器端的驗證主要是驗證該註冊資訊是否已經存在於伺服器中,如果註

分針網—每日分享ajax提交

print win -c 找不到 用戶 post請求 its -o block ajax提交表單在項目中常用,前臺無論是簡單的html、jsp或者是使用了easyui框架,提交表單都會使用到ajax,extjs框架其實也是使用了ajax只不過對其進行了封裝了,我們使用的時

python--DenyHttp項目(1)--socket編程客戶與服務器

brush accept acc -- highlight 發送消息 src size 接受 查找了許多資料,實現了客戶端與服務器端的連接,通過虛擬機進行測試 服務器端IP:192.168.37.129 端口1122 客戶端IP:  192.168.37.1 端口1122

寫給產品經理的技術書客戶、服務和交互相關技術

gif manage 輸入法 fad 圖形 三位數 更換 網購 zoom 產品經理有三大領域的技術是需要去攻克的,分別是:客戶端相關技術、服務端相關技術、交互相關技術 一、客戶端相關技術 1.iOS和安卓產品差異 1.1 應用的設備不同: IOS和安卓最大的區別在於本身所應

WCF分布式4客戶訪問寄宿在IIS中的WCF服務

ram order ble style 部署過程 比較 logs 一個 model 部署過程比較簡單,新建一個站點,指向服務的物理路徑,設置一個端口。即可。 新建的站點對應一個應用程序池,設置應用程序池中的.NET版本為4.0 寫一個測試客戶端,訪問IIS中的WCF服務,可

移動驗證用戶名與手機號

div username clas urn tex function get 輸入 java <form action="" class="form" action="" method="post" id="form1"> <div class="

web API簡介(三)客戶儲存之Web Storage API

mark gpo .com htm tor b-s href 簡介 logs 概述 前篇:web API簡介(二):客戶端儲存之document.cookie API 客戶端儲存從某一方面來說和動態網站差不多。動態網站是用服務端來儲存數據,而客戶端儲存是用客戶端來儲存數據。

web API簡介(四)客戶儲存之IndexedDB API

特性 通知 name com 模式 upgrade doesn 需要 code 概述 前篇:web API簡介(三):客戶端儲存之Web Storage API 客戶端儲存從某一方面來說和動態網站差不多。動態網站是用服務端來儲存數據,而客戶端儲存是用客戶端來儲存數據。 In

】document.form.action,分向提交

用戶 方法 一個表 form 屬性 method cli submit 關於 document.form.action,表單分向提交,javascript提交表單 同一個表單可以根據用戶的選擇,提交給不同的後臺處理程序。即,表單的分向提交。如,在編寫論壇程序時,如果我們

maven(二) maven項目構建ssh工程(父工程與子模塊的拆分與聚合)

圖片 做的 bsp IT 是個 pan 有一種 junit img 出處:http://www.cnblogs.com/whgk/p/7121336.html 前一節我們明白了maven是個什麽玩意,這一節就來講講他的一個重要的應用場景,也就是通過maven將一個ssh

36、Flask實戰第36天客戶權限驗證

man 前臺 role .html last endif 開發 運營 賬號 編輯cms_base.html <li><a href="#">{{ g.cms_user.username }}<span>[超級管理員]</

php學習筆記第八節--和使用者輸入,$_GET,$_POST

PHP 的 $_GET 和 $_POST 用於檢索表單中的值,比如使用者輸入。 PHP 表單處理 表單例項: <html> <body> <form action="welcome.php" method="post"> Name: <inpu

基於CAS的點登入SSO[4]: 加入兩個CAS客戶測試點登入

基於CAS的單點登入SSO[4]: 加入兩個CAS客戶端測試單點登入 作者:家輝,日期:2017-08-22 CSDN部落格: http://blog.csdn.net/gobitan 摘要:本系列的前三篇文章分別搭建了基於CAS的單點登入伺服器,並讓伺

RSA非對稱加密演算法(提交時,前端js加密,後java解密)

RSA非對稱加密演算法(表單提交時,前端js加密,後端java解密 非對稱加密演算法 需要的工具 前端jsp頁面 js程式碼 加密解密的工具類 產生公鑰的類 處理登陸請求的類 加密成功的密碼 非對稱加密演算

Spring-MVC前後註冊Demo

Demo  V1.0 https://download.csdn.net/download/whandwho/10567698 對spring的dao(@Repository)、service、conponent、controller、model層進行了分別的示例、環境配置完全OK

[HDFS-inotify]“IOException客戶在讀取檔案後停止

1.我想寫下一個在建立時在特定位置讀取檔案的程式碼(使用inotify)     所以我在github中修改了基於“hdfs-inotify-example”的示例程式碼https://github.com/onefoursix/ HDFS-的inotify-示例/

html5自動驗證2必須是字母開頭驗證

最近在做一個表單驗證,之前的要求是***包含英文大小寫字母、數字、下劃線和減號,現在多加了個條件***須是以字母開頭,在網上學了很多方法,但都是用的js,而我想要的是html5的智慧驗證,不用js,以簡單的粗暴方法來完成,吶,下面直接貼程式碼啦 <input type="tex

WebService手寫簡單案例客戶與服務的資料互動

本篇部落格是模擬服務端釋出服務,客戶端模擬接收服務端的返回資料的一個簡單案例(客戶端輸入姓名,服務端根據客戶端輸入的姓名模糊查詢身份證的案例) 服務端釋出服務 1.專案準備工作:新建一個web專案,匯入mysql的jar包放入工程,寫好jdbc連線,寫好實體類,寫dao,不同的

JSAJAX提交資料

方法一、前臺通過物件傳遞引數,後臺通過物件的屬性獲取值 jsp程式碼: $.ajax({ type: "POST", url:"/manage/admin/addOrUpdate", data:{