打造可複用可擴充javascript驗證表單指令碼

來源:互聯網
上載者:User

如果需要從使用者那裡收集資訊,就需要使用表單。

表單包含大多數常見的圖形介面元素,例如文字框,選項按鈕,複選框,下拉式功能表等等。

填寫完表單,點擊Submit按鈕將表單發送給web伺服器,儘管可以通過伺服器CGI程式完成驗證,但在用戶端用javascript驗證要快得多,而且使用者操作的效率也高。


這篇部落格,主要是把我寫的一個用於驗證表單的可複用,可擴充的javascript指令碼(版本1.0)分享給大家.

先來看看實現效果:

1、初始表單


2、提交,

如果Email為空白,則:


3、如果Email不符合規範,則:


4、如果沒有選擇下拉框內容,則:


5、如果沒有選擇選項按鈕中的一個,則:


6、根據已選欄位,自動選擇其他欄位:選擇NormalUser會自動選擇2G

驗證兩個至少選一個:如果沒有輸入地址,也沒有選擇地址,則:


7、驗證郵編:如果輸入錯誤的郵編則:


8、驗證檔案:如果輸入錯誤的Image格式,則:


javascript指令碼(ValidForm1.js):

// JavaScript Documentwindow.onload=initForms;function initForms(){for (var i=0;i<document.forms.length;i++){//遍曆所有表單,執行驗證document.forms[i].onsubmit=function(){return validForm();}};//為複選框NormalUser註冊事件document.getElementById("NormalUser").onclick=spaceSet;};function validForm(){var allGood=true;//獲得所有標籤var allTags=document.getElementsByTagName("*");for (var i=0;i<allTags.length;i++){//檢驗所有標籤if(!validTag(allTags[i])){allGood=false;};};    return allGood;    //檢驗標籤是否有效    function validTag(thisTag){var outClass="";//獲得該標籤的class屬性var allClasses=thisTag.className.split(" ");for (var j=0;j<allClasses.length;j++){//驗證該標籤,通過改變class標識無效標籤outClass += validBasedOnClass(allClasses[j])+" ";};thisTag.className=outClass;if(outClass.indexOf("invalid")>-1){//標識出無效的輸入值前的標籤invalidLabel(thisTag.parentNode);//無效輸入標籤獲得焦點thisTag.focus();//如果是輸入標籤,則選中其中的文本if(thisTag.nodeName=="INPUT"){thisTag.select();};return false;};return true;//標識無效的欄位,添加類名invalidfunction validBasedOnClass(thisClass){var classBack="";//驗證,在這裡可以擴充驗證switch(thisClass){case "":case "invalid":break;case "reqd":    //判斷空if (allGood && thisTag.value=="")//invalid後有空格{classBack="invalid ";};classBack += thisClass;break;    case "radio":    //檢查是否已選單選框if(allGood && !radioPicked(thisTag.name)){classBack="invalid ";};classBack += thisClass;break;case "isNum"://檢查是否是數字if(allGood && !isNum(thisTag.value)){classBack="invalid ";};classBack += thisClass;break;case "isEmail"://檢查是否是Emailif(allGood && !isEmail(thisTag.value)){classBack="invalid ";};classBack += thisClass;break;case "isImage"://檢查是否是圖片,可以演化為檢查檔案名稱if(allGood && !isImg(thisTag.value)){classBack="invalid ";};classBack += thisClass;break;case "isPostcode":    //檢查郵遞區號    if(allGood && !isPostcode(thisTag.value)){classBack="invalid ";};classBack += thisClass;break;case "isAddress":classBack += thisClass;break;default:   //invalid後有空格   //檢查是否至少已經設定了兩個欄位之一   if(allGood && !crossCheck(thisTag,thisClass)){classBack="invalid ";};classBack += thisClass;};return classBack;};//檢查是否至少已經設定了兩個欄位之一//這是為郵遞區號欄位和地址清單元素準備的function crossCheck(inTag,otherFieldID){if(!document.getElementById(otherFieldID)){return false;};return (inTag.value!="" || document.getElementById(otherFieldID).value!="")};//標識出有問題的欄位的標籤function invalidLabel(parentTag){if(parentTag.nodeName=="LABEL"){//invalid前有空格parentTag.className += " invalid";};};//確保使用者選擇了一個選項按鈕function radioPicked(radioName){var radioSet="";//迴圈遍曆表單,如果找到要找選項按鈕組,radio就會包含一個值for (var k=0;k<document.forms.length;k++){//將radioSet設定為正在查看的表單中選項按鈕組的名稱if(!radioSet){radioSet=document.forms[k][radioName];};};//如果不能找到選項按鈕組,則返回false,不能選擇選項按鈕if(!radioSet){return false;}//檢查每個選項按鈕,如果有一個被選中,則返回truefor(k=0;k<radioSet.length;k++){if(radioSet[k].checked){return true;};};//沒有發現被選中選項按鈕,則返回false    return false;};//驗證是否是數字function isNum(passedVal){//如果欄位是空的,那麼肯定不是數組,直接返回False就可以了if (passedVal==""){return false;}for(var k=0; k<passedVal.length;k++){        //charAt函數返回欄位位置K上的字元,檢查是否為數字if(passedVal.charAt(k)<"0"){return false;}if (passedVal.charAt(k)>"9"){return false;}};  return true};    //純javascript檢查郵箱(不使用Regex),只是檢驗輸入的內容符合Email的正確形式,無法確認是否存在。function validEmail(email){//驗證是否存在空格,斜杠,冒號,都好分號等無效字元var invalidChars=" /:,;";if (email==""){return false;};for (var k=0;k<invalidChars.length;k++){var badChar=invalidChars.charAt(k);if(email.indexOf(badChar)>-1){return false;};};//驗證是否存在@var atPos=email.indexOf("@",1);if(atPos==-1){return false;};//驗證@是否重複存在if(email.indexOf("@",atPos+1)!=-1){return false;};//驗證是否存在點var periodPos=email.indexOf(".",atPos);if(periodPos==-1){return false;};//驗證點號後是否至少有兩個字元if(periodPos+3>email.length){return false;};return true;};//用Regex檢驗電子郵件地址(推薦使用)function isEmail(email){var reEmail=/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;return reEmail.test(email);};//用Regex檢驗檔案尾碼是否為gif或jpgfunction isImg(newURL){var reImg=/^(file|http):\/\/\S+\/\S+\.(gif|jpg)$/i;return reImg.test(newURL);};    //驗證郵遞區號function isPostcode(postcode){var rePostcode=/^[0-9]{6}$/;return rePostcode.test(postcode);}//可以在這裡繼續擴充驗證內容,例如//驗證有線電話號碼//驗證手機};};//根據使用者做出的選擇自動化佈建欄位輸入function spaceSet(){if(this.checked){document.getElementById("Space2").checked=true;}else{document.getElementById("Space2").checked=false;};};

注釋,我盡量寫得詳細些,大家應該能看明白。

可複用:

基本上囊括了表單上最常用的幾個控制項的驗證方法.

可擴充,方法:

只要在這個位置

加入你需要驗證的標籤的class屬性,

 然後在這裡,


添加你的驗證方法即可.


Html文檔:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>無標題文檔</title>    <script type="text/javascript" src="ValidForm1.js"></script>    <link rel="stylesheet" type="text/css" href="ValidForm.css"></head><body><h2 >Valid Form</h2><form action="#"><p><label for="emailAddr">Email Address:    <input id="emailAddr" type="text" size="30" class="reqd isEmail" />        </label></p>            <p><label for="color">Colors:    <select id="color" class="reqd">        <option value="" selected="selected">Choose a color</option>        <option value="Red">Red</option>         <option value="Green">Green</option>          <option value="Blue">Blue</option>          </select>         </label></p>    <p>Options:    <label for="NormalUser"><input type="checkbox" id="NormalUser" value="Yes" />NormalUser(2G only)  </label>         <label for="AdvancedUser"><input type="checkbox" id="AdvancedUser" value="Yes" />AdvancedUser</label></p>     <p><label for="Space">Space:     <input type="radio" id="Space2" name="Space" value="2G" class="radio" />2G       <input type="radio" id="Space4" name="Space" value="4G" class="radio" />4G     </label></p>           <p><label for="address">Enter your Address or pick the Address<br />Address: <input type="text" id="address" size="30" maxlength="30" class="isAddress addressList"/>       <select id="addressList" size="4" class="address">     <option value="cangzhou">Cangzhou</option>        <option value="langfang">Langfang</option>        <option value="handan">Handan</option>        <option value="baoding">Baoding</option>        <option value="zhangjiakou">Zhangjiakou</option>      </select>     </label></p>     <p><label for="postcode">Postcode: <input id="postcode" type="text" size="6" maxlength="6" class="isPostcode" /></label></p>           <p><label for="image">Image URL:<input id="image" type="text" size="30" maxlength="30" class="isImage" /></label></p>            <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p></form></body></html>

CSS樣式表(ValidForm.css):

@charset "utf-8";/* CSS Document */body{color:#000;background-color:#FFF;}input.invalid{/*當輸入無效時,使用該樣式*/background-color:#FF9;border:2px red inset;}label.invalid{/*當輸入無效時,使用該樣式*/color:#F00;}

歡迎拍磚!

會把改進放到版本2.0裡!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.