2011-09-24 42 views
0

我想從Javascript-Coder.com實現JavaScript表單驗證腳本,可以找到here如何獲取表單驗證腳本以使用數組?

我有工作表單上的元素,但我想知道如何讓它與數組一起工作。具體來說,我有一個網頁here,用戶可以添加行的表單。然後,我有以下形式:

<form method="post" name="booking" id="booking" action="bookingengine.php"> 
    <fieldset> 
     <h2>Waged/Organisation Rate</h2> 
     <p> 
      <input type="text" name="name[]" id="name"> 
      <input type="text" name="email[]" id="email"> 
      <input type="text" name="organisation[]" id="organisation"> 
      <input type="text" name="position[]" id="position"> 
     </p> 
     <p><span class="add">Add person</span></p> 
    </fieldset> 

    <fieldset> 
     <h2>Unwaged Rate</h2> 
     <p> 
      <input type="text" name="name2[]" id="name2"> 
      <input type="text" name="email2[]" id="email2"> 
     </p> 
     <p><span class="add">Add person</span></p> 
    </fieldset> 

    <p><input type="submit" name="submit" id="submit" value="Submit and proceed to payment page" class="submit-button" /></p> 

</form> 

目前的形式驗證腳本是這樣的:

<script language="JavaScript" type="text/javascript"> 
var frmvalidator = new Validator("booking"); 

frmvalidator.addValidation("email[]","req","Please enter a valid email address"); 
frmvalidator.addValidation("email[]","email","Please enter a valid email address"); 

</script> 

但是,如果用戶增加了第二排的形式的頂部,該腳本只驗證第一行的電子郵件地址,我想知道如何讓它驗證添加到表單的每一行。

附加信息

繼Melsi的意見產生形式和處理確認已經完全重寫劇本。下面通過Melsi的響應包含了我所要求的以下特性(其中大部分是在原來的劇本太):

  1. 形式是現在頁面加載空的,所有行(文本框)被動態地添加用戶使用按鈕。
  2. 每個文本框的默認值顯示何時使用唯一顏色添加新行。
  3. 當用戶單擊每個文本框時,文本和背景的顏色會發生變化。
  4. '刪除'按鈕被添加到每行的末尾,以便可以刪除行。是

驗證的必需

的每行都需要驗證如下:

  1. 名稱:是不是 '名稱'(消息: 「請輸入您的姓名」),最多100個字符(消息:「你的名字應該少於100個字符」)
  2. 電子郵件:是一個有效的電子郵件地址(消息:「Pleas (請輸入一個有效的電子郵件地址「),最多100個字符(消息:」您的電子郵件地址應少於100個字符「)
  3. 位置:不是'位置'(消息:」請輸入您的位置或N/a。如果不適用「),最多100個字符(消息:‘您現在的位置應該是少於100個字符’)
  4. 組織:是不是‘組織’(消息:」請輸入您的組織或 N/A如果不適用「),最多100個字符(消息:」您的組織 應小於100個字符「)

那我就需要一個確認提交,檢查該行已被添加到形式,出現「請添加至少一個人預訂」

驗證實例形式:

//validate-name 
box=document.getElementById(caller).name.charAt(0); 
if(box=='n'){ 
if((document.getElementById(caller).value)=='Name') 
    { 
     alert('Please enter your name') 
     document.getElementById('message').innerHTML="<span>Please enter your name</span>"; 
     //put focus back again if you like 
     document.getElementById(caller).focus(); 
     return; 
    } 
}   
//if code comes here = validation success 
    document.getElementById(caller).style.backgroundColor = '#F5FEC1'; 
    document.getElementById('message').innerHTML="<span style="+dbq+"background-color: #A3BB00"+ dbq+">Thanks!</span>"; 
} 
+0

是的,謝謝。現在表格看起來像我想要的。你可以看到最新版本[這裏](http://www.soterianetwork.org.uk/conference2/index.html)。我現在試圖弄清楚驗證如何工作。我現在要編輯原始問題,以便它與您的答案相符,包括更多關於我需要的驗證的信息。 – Nick

+0

嗨,梅爾西。當我問這個問題時,我剛剛開始處理驗證腳本,因此我只是將電子郵件驗證置於原地。這個驗證是爲我上面鏈接的gen_validatorv4.js腳本設計的,所以我假定它需要爲腳本重寫。現在我已經在原始問題中包含了我需要的所有驗證。也許你可以包括一個我將如何包含這些驗證中的一個的例子,以便我可以開始使用它?謝謝。 – Nick

+0

謝謝,我的電子郵件驗證工作正常,但無法使其他驗證工作。我在上面的問題末尾輸入了名稱驗證代碼。使用此代碼,該腳本已損壞,我無法將文本框添加到表單中。 – Nick

回答

1

即使在動態域中,您也可以在每個域上添加onchange事件,他們會在更改sson時調用驗證器,以便用戶隨時知道它是否是有效的入口。

==========編輯的角色,感覺這裏的一些代碼替換爲更好的版本=====

我寫的匆忙這個代碼,例如色彩應用,新的行例子也是,刪除也被添加,焦點上的空框也被應用,並且所有其他事情都被問到。

<html> 
<head> 
<script type="text/javascript"> 

/** 
A dynamic name is assigned to a new field created. 
*/ 
var id=0; 
var dbq="\""; 

/************************* addRow function end ******************************************/ 
function addRow(count) 
{ 
/** 
Decide what fieldset is going to host the row 
*/ 
    var myFieldset='fieldset2'; 
    var section='2'; 
    if(count==4){ 
     myFieldset='fieldset1'; 
     var organisationID = id++; 
     var positionID = id++; 
     var section='' 
     } 
/** 
    Create ids 
*/ 
    divID = id++; 
    nameID = id++; 
    emailID = id++; 
/** 
    The row will be hosted in a div 
*/ 
    var myDiv = document.createElement("div"); 
     myDiv.setAttribute("id", divID); 
/** 
    Create the text boxes 
*/ 
    myDivInnerHTML= 
    '<input type=text name=name'+section+'[]'+' value=Name id='+nameID+ 
    ' onFocus='+dbq+'emptyTheBox('+nameID+');'+dbq+ 
    ' onkeyup='+dbq+'changeInputColor('+nameID+');'+dbq+ 
    ' onBlur='+dbq+'fieldValidator('+nameID+');'+dbq+ 
    ' style='+dbq+'color:#66634F;'+dbq+' >'+ 

    '<input type=text name=email'+section+'[]'+' value=Email id='+emailID+ 
    ' onFocus='+dbq+'emptyTheBox('+emailID+');'+dbq+ 
    ' onkeyup='+dbq+'changeInputColor('+emailID+');'+dbq+  
    ' onBlur='+dbq+'fieldValidator('+emailID+');'+dbq+ 
    ' style='+dbq+'color:#66634F;'+dbq+'>' ; 
/** 
    Decide if we need 4 or 2 boxes 
*/ 
    if(count==4) 
    myDivInnerHTML=myDivInnerHTML+ 
    '<input type=text name=organisation'+section+'[]'+' value=Organisation id='+organisationID+ 
    ' onFocus='+dbq+'emptyTheBox('+organisationID+');'+dbq+ 
    ' onkeyup='+dbq+'changeInputColor('+organisationID+');'+dbq+ 
    ' onBlur='+dbq+'fieldValidator('+organisationID+');'+dbq+ 
    ' style='+dbq+'color:#66634F;'+dbq+' >'+ 

    '<input type=text name=position'+section+'[]'+' value=Position id='+positionID+ 
    ' onFocus='+dbq+'emptyTheBox('+positionID+');'+dbq+ 
    ' onkeyup='+dbq+'changeInputColor('+positionID+');'+dbq+ 
    ' onBlur='+dbq+'fieldValidator('+positionID+');'+dbq+ 
    ' style='+dbq+'color:#66634F'+dbq+'>' ; 
/** 
    Create a button to remove the row too. 
*/ 
    myDivInnerHTML=myDivInnerHTML+ 
    '<input type=button class="remove" value="Remove" onClick='+dbq+'removeDiv('+divID+','+ myFieldset +');'+dbq+' >'; 
/** 
    Add the div-row to the fieldset 
*/ 
    myDiv.innerHTML = myDivInnerHTML; 
    document.getElementById(myFieldset).appendChild(myDiv);  
} 
/************************* addRow function end ******************************************/ 

/** 
    Change the color of the text being entered 
*/ 
function changeInputColor(caller){ 
    document.getElementById(caller).style.color = 'black'; 
} 

/** 
    Remove a row on demand 
*/ 
function removeDiv(divID, myFieldset){ 
    myFieldset.removeChild(document.getElementById(divID)); 
} 

/** 
    Empty the box on initial click 
*/ 
function emptyTheBox(caller) 
{ 
    var val=document.getElementById(caller).value; 
    if(val=='Name' || val=='Email' || val=='Organisation' || val=='Position' ) 
     document.getElementById(caller).value=''; 
} 
/** 
    Display a message 
*/ 
function echo(message) 
{ 
     document.getElementById('message').innerHTML="<h3>"+message+"</h3>"; 
} 


/**********************Validates a single field, return false on fail************************/ 
function fieldValidator(caller) 
{ 
    var error=''; 
    /** 
     Identify the field (if it is email, name etc) by getting the first character 
     which is always the same,also get its value and full name 
    */ 
    var currentFieldCategory = document.getElementById(caller).name.charAt(0); 
    var currentFieldValue = document.getElementById(caller).value; 
    var currentField = document.getElementById(caller); 

    /** 
     Check for empty value 
    */ 
    if(currentFieldValue == '') 
    { 
     echo('Please fill the data!');currentField.focus(); 
     return 'Please fill the data!'; 
    } 
    /** 
     Check if default value left behind 
    */ 
    if(currentFieldValue.toLowerCase()=="name" || currentFieldValue.toLowerCase() 
    =="email" || currentFieldValue.toLowerCase()=="organisation" || 
    currentFieldValue.toLowerCase()=="position") 
    { 
     echo('Please check you entry, default data left behind!');currentField.focus(); 
     return 'Please check you entry, default data left behind!'; 
    }  
    /** 
     Validate the NAME field 
    */ 
    if(currentFieldCategory=='n') 
    { 
     if(currentFieldValue.match(/^[ |'|-]/)||!(/^[a-zA-Z- ']*$/.test(currentFieldValue)) 
      || currentFieldValue.length<4 || currentFieldValue.length>70) 
     { 
      echo('Non valid name found!');currentField.focus(); 
      return 'Non valid name found!'; 
     }//inner if 
    }//outer if 
    /** 
     Validate a non empty EMAIL name field 
    */ 
    if(currentFieldCategory=='e') 
    { 
     var atpos=currentFieldValue.indexOf("@"); 
     var dotpos=currentFieldValue.lastIndexOf("."); 
     if (atpos<1 || dotpos<atpos+2 || dotpos+2>=currentFieldValue.length) 
     { 
      echo('Non valid email found!');currentField.focus(); 
      return 'Non valid email found!'; 
     }//inner if 
    }//outer if 
    /** 
     Validate a non empty ORGANIZATION name field 
    */ 
    if(currentFieldCategory=='o') 
    { 
     if(currentFieldValue.length<2 || currentFieldValue.length>50) 
     { 
      echo('Use at least 2 letters and less than 50 for your organisation.'); 
      currentField.focus();   
      return 'Use at least 2 letters and less than 50 for your organisation.';   
     }//inner if 
    }//outer if 
    /** 
     Validate a non empty POSITON name field 
    */ 
    if(currentFieldCategory=='p') 
    { 
     if(currentFieldValue.length<7 || currentFieldValue.length>40) 
     { 
      echo('Use at least 7 letters and less than 40 to describe your position.'); 
      currentField.focus(); 
      return 'Use at least 7 letters and less than 40 to describe your position.';    
     }//inner if 
    }//outer if  
    /** 
     Now on success do the rest 
    */ 
    document.getElementById(caller).style.backgroundColor = '#FF9900'; 
    document.getElementById('message').innerHTML=""; 
    return true; 
} 
/*****************fieldValidator ***function ends*****************************************/ 



/*******************************************************************************************/ 
function finalValidator() 
{ 
    /** 
     Get the form object 
    */ 
    var myForm=document.getElementById('booking').elements; 
    /** 
     Check if the form has no rows, for now 3 indicates no rows, 
     BE CAREFULL it might change if more buttons added, 
     just alert the length to see. 
    */ 
    if(myForm.length==3) 
     return false; 
    /** 
     Iterate through the form for all fields 
    */ 
    for(var i = 0; i < myForm.length; i++) 
     { 
      //If it is a text field validate it 
      if(myForm[i].type=='text') 
      { 
       var validation = fieldValidator(myForm[i].id); 
       if(validation!==true) 
       { 
        echo (validation); 
        return false;//prevent submit 
       }//validation if 
      }//field type if 
     }//for loop 
}//function 
/*******************************************************************************************/ 


</script> 

</head> 
<body bgcolor=gray> 

<div id="add-buttons"><span class="add" onclick="addRow(4);"><input type="button" class="button" value="Add Waged Person"></span><span class="add" onclick="addRow(2);"><input type="button" class="button" value="Add Unwaged Person"></span></div> 


<div id="message" ></div> 
<div id="form-wrap"> 
<form method="post" name="booking" id="booking" action="bookingengine.php"> 
    <fieldset id="fieldset1"> 
     <div class="subtitle">Waged/Organisation Rate</div> 
    </fieldset> 

    <fieldset id="fieldset2"> 
     <div class="subtitle">Unwaged Rate</div> 
    </fieldset> 

    <!-- return finalValidator will allow submit only if fields are validated--> 
    <p><input type="submit" name="submit" id="submit" onClick="return finalValidator();" 
    value="Submit booking" class="submit-button" /></p> 
</form> 


</body> 
</html> 

驗證已添加。 數組和顏色的東西有點兒微不足道,你應該顯示你在自己身上做了什麼努力。只有當你看到某人的意志時纔會參與其中。

+0

再次感謝。我現在已經完成了所有驗證,但在我看來,使用onblur事件進行驗證並不是用於我的目的的最佳方法,原因有兩個:(1)錯誤消息不由用戶離開默認值值在一個文本框中(即他們需要輸入Name來輸入名稱文本框來觸發錯誤)。有沒有觸發默認值錯誤的方法? (2)用戶可能無法完成所有文本框,因此需要在提交表單時觸發驗證。有沒有在表單提交中使用驗證的方法? – Nick

+0

再次感謝。我現在已經有了新的代碼。但是,除非輸入默認值,否則我不會收到有關默認值的錯誤消息。我的希望是,如果用戶在一個框中單擊,然後在另一個框中單擊,並將默認值留在後面,則會觸發錯誤消息。另外,如果表單中有多行,那麼第2,3行的錯誤消息全部顯示爲「未定義」。 – Nick

+0

感謝您的全力幫助。我已將問題標記爲已回答。不幸的是,雖然驗證似乎沒有正常工作。即使我正確輸入所有數據,我也會收到一個錯誤,指出'未定義!'當我嘗試提交表單時。你可以看到我的意思[這裏](http://www.soterianetwork.org.uk/conference2/index.html)。 – Nick

0

我決定添加其他answear原因,還有一些其他的東西我想提及調試。

至於你提到了造成這一行錯誤:

<div id="booking" style="font-size:16px;margin-bottom:10px;padding:5px">Please add the number of people 

爲什麼會出現這種情況?

如果你仔細觀察它已經得到一個id分配值的預訂,但你也有html表單分配相同的id,這會產生衝突,因爲javascript不知道你是哪一個意思。


通知書

- 你調試運行時總是devide的事情,這意味着你必須對自己的運行上面的腳本,如果它運行好,然後當內嵌在你的程序沒有那麼你知道100%有衝突。你提到了一個創建問題的特定函數(你是對的),那麼你必須進入函數內部,並提出一個警告('你好,不管!');一次從最頂端開始,一旦有警報沒有被調用,那麼你就知道哪一行有問題。然後你提醒這條線上的變量,看看它們是否有它們應該有的價值......最有可能的價值不會有價值必須有,你的問題已經非常小。

這就是現在,照顧身份證,他們必須是唯一的!如果你看到我的例子,我在最後分配上他們越來越指數

id="someElement"+(id++); 

很抱歉,如果這是太多的閱讀...但調試運行錯誤的方法能比這更痛苦(有一些神教程在調試!)。

+0

啊,非常感謝。對不起,我應該注意到了!缺口 – Nick

相關問題