2011-04-24 50 views
-1

我想通過表單字段進行循環,並根據存儲在數組中的正則表達式進行驗證。看不出這裏有什麼問題。請有任何想法嗎?訪問存儲表單驗證的正則表達式的2維數組

<script type="text/javascript">//<![CDATA[ 
    //Adds my event listener so that page loads before form becomes operational 
    if(window.addEventListener){ 
    window.addEventListener("load",initVal,false); 
    }else if (window.attachEvent){ 
    window.attachEvent("onload",initVal); 
    } else { window.onload=initVal;} 

    function initVal() { 
    document.orderform.postcode.onchange=checkAll; 
    document.orderform.email.onchange=checkAll; 
     } 
    function checkAll(){ 

    //create 2-dimensional array  
      frmflds= new Array (2); 
     for (i=0;i<frmflds.length;i++) { 
      frmflds [i] = new Array (2); 
    //populate arrays 
      frmflds[0][0] = 'postcode'; 
      frmflds[0][1] = '/^[A-z][A-z]\d{2}\s\d{2}[A-z][A-z]|[A-z][A-z]\d{1}\s\d{1}[A-z][A-z]$/'; 
      frmflds[1][0] = 'email'; 
      frmflds[1][1] = '/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/'; } 
    // loop through form elements and validate against regex stored in array        
    for(var j = 0; j < frmflds.length; j++) { 
    var e = frmflds[j][0][1]; 
    var OK= (e.exec(document.orderform.getElementById()[j].name.value); 
    if !OK 
    { 
    document.orderform.name[j].style.borderColor="red"; 
    document.orderform.name[j].style.backgroundColor="pink"; 
    document.orderform.Submit.onclick.disabled=true; 
    alert("Please correct any highlighted fields and submit again!"); 
    }   
    else{ 
    document.orderform.name[j].style.borderColor="Green"; 
    document.orderform.name[j].style.backgroundColor="PaleGreen"; 
    document.orderform.Submit.onclick.disabled=false; 
    }    
    } }     
    //]]></script> 
    </head> 
    <body> 
    <form method="post" action=""" name="orderform" id="orderfm"> 
    <p><input type="text" name="postcode" id="postcode" ></p> 
    <p><input type="text" name="email" id="email" ></p> 
    <p><input label="" type="submit" name="Submit" value="Submit" id="Submit" disabled="disabled"> 
    </form> 
    </body> 
</html> 

回答

0

,而不是嘗試循環通過他們你爲什麼不使用jQuery Validate這將覆蓋所有的標準驗證。那麼,如果你有自定義的正則表達式你喜歡跑步,你可以使用addMethod()功能,將您節省大量的頭痛和其有據可查

這裏是如何添加驗證方法的example

1

讓我們開始在頂部。

這沒有任何意義:

frmflds = new Array(2); 
for(i = 0; i < frmflds.length; i++) { 
    frmflds[i] = new Array(2); 
    //populate arrays 
    frmflds[0][0] = 'postcode'; 
    frmflds[0][1] = '/^[A-z][A-z]\d{2}\s\d{2}[A-z][A-z]|[A-z][A-z]\d{1}\s\d{1}[A-z][A-z]$/'; 
    frmflds[1][0] = 'email'; 
    frmflds[1][1] = '/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/'; 
} 

你通過數組去兩次,並設置frmflds[i]每次一個新的雙元素數組;這足夠合理,但每次通過陣列時,您每次都將frmflds設置爲相同的值。在第一次迭代中,frmflds[1]將沒有任何用處,但是您將它視爲數組,因此無法將未定義的值視爲數組來處理。在JavaScript引擎關閉之前,您的代碼甚至無法通過此循環的一次迭代。而正則表達式和字符串是不同的東西,所以你不想用字符串單引號包裝你的正則表達式。我想你想更簡單的東西是這樣的:

var frmflds = [ 
    [ 'postcode', /^[A-z][A-z]\d{2}\s\d{2}[A-z][A-z]|[A-z][A-z]\d{1}\s\d{1}[A-z][A-z]$/ ], 
    [ 'email', /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/      ] 
]; 

另外在frmflds前注意var,這將讓你變漂亮和本地化,而不是使其成爲全球性的。

然後我們來此,並沒有任何意義之一:

for(var j = 0; j < frmflds.length; j++) { 
    var e = frmflds[j][0][1]; 
    var OK= (e.exec(document.orderform.getElementById()[j].name.value); 
    if !OK { 
     document.orderform.name[j].style.borderColor="red"; 
     document.orderform.name[j].style.backgroundColor="pink"; 
     document.orderform.Submit.onclick.disabled=true; 
     alert("Please correct any highlighted fields and submit again!"); 
    }   
    else{ 
     document.orderform.name[j].style.borderColor="Green"; 
     document.orderform.name[j].style.backgroundColor="PaleGreen"; 
     document.orderform.Submit.onclick.disabled=false; 
    } 
} 

記住frmflds是一個二維數組,而不是一個三維之一;所以,var e = frmflds[j][0][1];不會做任何有用的事情。我想你想要這樣的:

var re = frmflds[j][1]; // This is where the regex is 

現在,getElementById()document的方法,它需要一個ID作爲參數,getElementById()也返回單個元素(不是數組),所以你想要這個:

var el = document.getElementById(frmflds[j][0]); 
var OK = re.exec(el.value); 

您的if聲明需要括號。而且,如果你的表單元素有id屬性,使用它們,而不是試圖去通過document.orderform

var submit = document.getElementById('Submit'); 
if(!OK) { 
    el.style.borderColor  = 'red'; 
    el.style.backgroundColor = 'pink'; 
    submit.disabled   = true; 
    alert('Please correct any highlighted fields and submit again!'); 
} 
else 
    el.style.borderColor  = 'green'; 
    el.style.backgroundColor = 'palegreen'; 
    submit.disabled   = false; 
} 

這應該讓你的東西,將至少運行。進一步的調試作爲讀者的練習。