春風(fēng)博客

          春天里,百花香...

          導(dǎo)航

          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計(jì)

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個(gè)人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          通用化Web表單驗(yàn)證方式的改進(jìn)方案



          本文是“表單驗(yàn)證方式的通用化”的續(xù)篇。

          在上文的表單驗(yàn)證解決方案中,有這樣幾個(gè)問題:
          1。頁面中存在自定義標(biāo)簽,這通不過W3C驗(yàn)證。
          2。自定義標(biāo)簽不能寫在Struts標(biāo)簽中,造成此解決方案在Struts工程中不適用。
          3。驗(yàn)證的方式和頁面內(nèi)容混合在一起,沒有分開。
          4。原反饋信息span的id必須符合一定規(guī)范,這是額外的負(fù)擔(dān)。

          為了解決這些問題,我采取了如下步驟:
          1。建立一種數(shù)據(jù)結(jié)構(gòu),讓它容納文本框id,反饋span的id,驗(yàn)證正則表達(dá)式,是否必須輸入等四個(gè)信息。這樣頁面就不會(huì)混雜自定義標(biāo)簽,w3c驗(yàn)證和struts標(biāo)簽不支持的問題就解決了。
          2。建立一個(gè)包含多個(gè)這種數(shù)據(jù)結(jié)構(gòu)的數(shù)組,其中元素與要驗(yàn)證的文本域一一對(duì)應(yīng)。此數(shù)組在需要驗(yàn)證時(shí)建立。這里雖然要多些一些JS代碼,但驗(yàn)證信息更集中更容易修改了。
          3。需要驗(yàn)證時(shí)取得數(shù)組元素,挨個(gè)驗(yàn)證即可,需要的信息都可以從數(shù)組元素中取得。整個(gè)過程可以庫化通用化,頁面不需要寫驗(yàn)證。

          如此做完后,我認(rèn)為原先的問題基本得到解決了。下面請(qǐng)看具體代碼:

          1。頁面代碼。
                            <!-- 調(diào)用通用驗(yàn)證函數(shù)checkForm -->
                            
          <form action="ShowPage" onsubmit="return checkForm(getCheckArray());">
                            
          <!-- 內(nèi)置表格開始 -->
                            
          <table width=660 align=center border=0>
                              
          <tbody>
                                
          <tr>
                                  
          <td width=70>姓名:</td>
                                  
          <td>
                                      
          <input type="text" 
                                             name
          ="name" 
                                             onfocus
          ="this.style.backgroundColor='#e6e6e6'" 
                                             onblur
          ="this.style.backgroundColor='#ffffff'"/>
                                      
          <font color=red>&nbsp;(必填)</font>
                                      
          <span id="nameMsg" class="feedbackHide">用戶名必須輸入兩到三位漢字</span>
                                  
          </td>
                                
          </tr>
                                
          <tr>
                                  
          <td width=70>職位:</td>
                                  
          <td>
                                      
          <input type="text" 
                                             name
          ="title" 
                                             onfocus
          ="this.style.backgroundColor='#e6e6e6'" 
                                             onblur
          ="this.style.backgroundColor='#ffffff'" />
                                      
          <font color=red>&nbsp;(必填)</font>
                                      
          <span id="titleMsg" class="feedbackHide">員工職位必須是二到五位漢字</span>
                                  
          </td>
                                
          </tr> 
                                
          <tr>
                                  
          <td width=70>年齡:</td>
                                  
          <td>
                                      
          <input type="text" 
                                             name
          ="age" 
                                             onfocus
          ="this.style.backgroundColor='#e6e6e6'" 
                                             onblur
          ="this.style.backgroundColor='#ffffff'" />
                                      
          <span id="ageMsg" class="feedbackHide">員工年齡在20到59之間</span>
                                  
          </td>
                                
          </tr>
                                
          <tr>
                                  
          <td width=70>密碼:</td>
                                  
          <td>
                                      
          <input type="password" 
                                             name
          ="pswd" 
                                             onfocus
          ="this.style.backgroundColor='#e6e6e6'" 
                                             onblur
          ="this.style.backgroundColor='#ffffff'" />
                                      
          <font color=red>&nbsp;(必填)</font>
                                      
          <span id="pswdMsg" class="feedbackHide">員工密碼必須是英語或數(shù)字</span>
                                  
          </td>
                                
          </tr> 
                                
          <tr>
                                
          <td width=70>郵件:</td>
                                  
          <td>
                                      
          <input type="text" 
                                             name
          ="email" 
                                             onfocus
          ="this.style.backgroundColor='#e6e6e6'" 
                                             onblur
          ="this.style.backgroundColor='#ffffff'" />
                                      
          <font color=red>&nbsp;(必填)</font>
                                      
          <span id="emailMsg" class="feedbackHide">輸入必須符合郵件地址格式,如XX@XXX.XX</span>
                                  
          </td>
                                
          </tr>  
                                
          <tr>
                                  
          <td></td>
                                  
          <td><input type="submit" value="錄入"/></td>
                                
          </tr>

                              
          </tbody>          
                            
          </table>
                            
          </form>
                            
          <!-- 內(nèi)置表格結(jié)束-->

          2。驗(yàn)證時(shí)創(chuàng)建數(shù)組的函數(shù),注意其與頁面元素的對(duì)應(yīng)關(guān)系。
          <script LANGUAGE="JavaScript">
          <!--
          /**
          * 取得需要驗(yàn)證的文本框控件數(shù)組
          *
          */

          function getCheckArray(){
              
          var arr=new Array();
              
              arr[
          0]=createToBeCheckedObj("name","nameMsg","[\\u4E00-\\u9FA5]{2,3}","true");
              arr[
          1]=createToBeCheckedObj("title","titleMsg","[\\u4E00-\\u9FA5]{2,5}","true");
              arr[
          2]=createToBeCheckedObj("age","ageMsg","[2-5]{1}[0-9]{1}","false");
              arr[
          3]=createToBeCheckedObj("pswd","pswdMsg","\\w+","true");
              arr[
          4]=createToBeCheckedObj("email","emailMsg","\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\.\\w+([-.]\\w+)*","true");

              
          return arr;
          }

          //-->
          </script>

          3。創(chuàng)建驗(yàn)證數(shù)據(jù)結(jié)構(gòu)的函數(shù)
          /**
          * Check a object will be checked when sbmit a form
          */

          function createToBeCheckedObj(textboxName,msgSpanId,validChar,isRequired){
              
          // Create the object will be checked
              var toBeCheckedObj=new Object;
              
              
          // Set propertied to toBeCheckedObj
              toBeCheckedObj.textboxName=textboxName;
              toBeCheckedObj.msgSpanId
          =msgSpanId;
              toBeCheckedObj.validChar
          =validChar;
              toBeCheckedObj.isRequired
          =isRequired;
              
              
          // create a method of toBeCheckedObj
              toBeCheckedObj.showProperties=function(){
                  alert(
          "TextboxName="+this.textboxName+" MsgSpanId="+this.msgSpanId+" ValidChar="+this.validChar+" IsRequired"+this.isRequired);
              }

           
              
          // return the object will be checked
              return toBeCheckedObj;
          }

          4。驗(yàn)證函數(shù)

          /**
          * Check form
          */

          function checkForm(toBeCheckedObjArray){
              
              
          for(var i=0;i<toBeCheckedObjArray.length;i++){
                  
          var    toBeCheckedObj=toBeCheckedObjArray[i];    
                  
          // toBeCheckedObj.showProperties();
                  
                  
          var checkResult=checkTextBox(toBeCheckedObj);
                  
                  
          if(checkResult){
                      document.getElementById(toBeCheckedObj.msgSpanId).className
          ="feedbackHide";
                  }

                  
          else{        
                      document.getElementById(toBeCheckedObj.msgSpanId).className
          ="feedbackShow";
                      document.getElementById(toBeCheckedObj.textboxName).focus();
                      
          return false;
                  }
                          
              }

           
               
          // alert("all passed");
              return true;
          }


          /**
          * Check text field in the form
          */

          function checkTextBox(toBeCheckedObj){
              
          var validChar=toBeCheckedObj.validChar;
              
          var isRequired=toBeCheckedObj.isRequired;
              
          var inputValue=document.getElementById(toBeCheckedObj.textboxName).value;
              
              
          if(isRequired!="true" && inputValue.length<1){
                  
          return true;
              }

              
          else{
                  
          var regexStr="^"+validChar+"$";
                  
          var regex=new RegExp(regexStr);
                  
          return regex.test(inputValue);
              }

          }

          5。驗(yàn)證效果



          以上,歡迎提出寶貴意見,在此感謝對(duì)前兩篇拙文提出寶貴建議的同仁。

          代碼下載:
          http://www.aygfsteel.com/Files/sitinspring/JsFormChecker20080521125711.rar

          posted on 2008-05-21 14:09 sitinspring 閱讀(3786) 評(píng)論(7)  編輯  收藏 所屬分類: Web開發(fā)JavaScript

          評(píng)論

          # re: 通用化Web表單驗(yàn)證方式的改進(jìn)方案 2008-05-21 19:01 基金凈值

          正是我需要的,謝謝!  回復(fù)  更多評(píng)論   

          # re: 通用化Web表單驗(yàn)證方式的改進(jìn)方案 2008-05-21 19:10 HiMagic!

          你可以用google搜一下form通用驗(yàn)證,好像是叫validator什么的,他使用了html tag的擴(kuò)展屬性,應(yīng)該比你的方案更好。此外,該方案完全丟棄了server端驗(yàn)證。  回復(fù)  更多評(píng)論   

          # re: 通用化Web表單驗(yàn)證方式的改進(jìn)方案 2008-05-21 20:31 如坐春風(fēng)

          @HiMagic!

          謝謝提示,有空我會(huì)去看的。 我這個(gè)方案也全是Client端的。
            回復(fù)  更多評(píng)論   

          # re: 通用化Web表單驗(yàn)證方式的改進(jìn)方案 2008-05-23 10:41 大牙

          如果你希望使用一個(gè)完善的Web頁面驗(yàn)證框架,建議還是去google搜索下載“我佛山人”的Validator。現(xiàn)在最新好像是4.0。十分好用,強(qiáng)烈推薦,呵呵~~  回復(fù)  更多評(píng)論   

          # re: 通用化Web表單驗(yàn)證方式的改進(jìn)方案 2008-05-23 13:17 如坐春風(fēng)

          @大牙

          謝謝推薦。
            回復(fù)  更多評(píng)論   

          # re: 通用化Web表單驗(yàn)證方式的改進(jìn)方案 2008-09-05 13:14 小數(shù)

          感覺頁面上的東西太多了  回復(fù)  更多評(píng)論   

          # re: 通用化Web表單驗(yàn)證方式的改進(jìn)方案 2008-09-05 21:53 尋道者

          @小數(shù)

          是還有改進(jìn)的余地。
            回復(fù)  更多評(píng)論   

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
          主站蜘蛛池模板: 噶尔县| 晋江市| 南召县| 九台市| 隆德县| 屯昌县| 关岭| 鹰潭市| 彝良县| 平遥县| 广饶县| 岚皋县| 华池县| 外汇| 海宁市| 张家港市| 武义县| 长岛县| 江都市| 洪洞县| 沧州市| 银川市| 武胜县| 沙洋县| 休宁县| 抚顺市| 桑日县| 昆山市| 区。| 邹平县| 石河子市| 三原县| 滨海县| 富源县| 慈溪市| 苍南县| 罗山县| 平南县| 平罗县| 屯门区| 同德县|