2011-07-23 107 views
0

我有這個驗證表單功能:簡單的JavaScript檢查不起作用?

function ValidateForm() { 
    var chks = document.register.elements['sendto[]']; 
    var hasChecked = false; 
    for (var i=0;i<chks.length;i++){ 
     if (chks[i].checked){ 
      hasChecked = true; 
      break; 
     } 
    } 
    if (!hasChecked){ 
     alert("Please select at least one friend."); 
     chks[0].focus(); 
     return false; 
    } 
} 

HTML代碼是這樣的:

<input type="checkbox" name="sendto[]" value="2" > 

我知道這是不是完整的代碼。完整的代碼是巨大的。但基本上,如果我在代碼中只有一個複選框,上面的代碼會在ValidateForm()上給出未定義的消息。當表單被提交併且在複選框上方被選中時被調用。

但是,如果我有這樣的代碼兩個複選框:

<input type="checkbox" name="sendto[]" value="2" > 
<input type="checkbox" name="sendto[]" value="4" > 

就當ValidateForm()函數被調用提交此工作正常。我做錯了,即使它被檢查,它不適用於1複選框嗎?

+1

什麼是註冊? – lovesh

+0

我假設'註冊表'是他的形式的名稱。 –

+0

@Gurnor你怎麼知道這個消息是未定義的?你在檢查控制檯嗎? – lovesh

回答

3

聲明

var chks = document.register.elements['sendto[]']; 

得到(元素* 小號 *,如果有一個以上的)與名sendto[] 如果有與名稱sendto[]只有一個元素,那麼你有該元素在chks中的引用。
如果有多個名稱爲sendto[]的元素,則chks將保留對這些元素的數組的引用。

當你這樣做:

for (var i=0;i<chks.length;i++){ 

您嘗試基於chks.length循環。如果chks是一個數組(參見上面:當存在多個名稱爲sendto[]的元素時),則chks.length將保存數組中的元素數。
如果只有一個sendto[]元素,那麼CHKS將持有該元素和由於元件(<input type="checkbox" name="sendto[]" value="2" >)沒有一個叫length屬性,瀏覽器說:長度indefined

所以你有兩個O之間分化方案中,當僅存在一個sendto[]複選框並且當存在多於一個:

var chks = document.register.elements['sendto[]']; 
    var hasChecked = false; 
//Check whether there is one checkbox or whether there are more  
if(chks.length) 
{ 
    for (var i=0;i<chks.length;i++) 
    { 
     if (chks[i].checked) 
     { 
     hasChecked = true; 
     break; 
     } 
    } 
} 
else 
{ 
    if(chks.checked) 
    { 
     haschecked = true; 
    } 
} 

PS:
代碼給出的消息未定義ValidateForm()傳達不了太多。即使對於你來說也不清楚這意味着什麼(這就是你問這個問題的原因)。嘗試提供更多細節。任何現代瀏覽器都會提供更多關於未定義的細節,什麼未定義哪條線等。即使是歷史悠久的瀏覽器也會告訴您未定義錯誤的行號。有了這些細節,您可以嘗試查找線路並嘗試查看發生的情況。你很可能會發現。如果你不這樣做,請將它發佈到這裏的社區,並提供所有這些細節。

+0

你的解釋非常好。但代碼不起作用? – Gurnor

+0

@Gurnor:_not working_ =?你沒有提供更多的細節。順便說一句,我的意圖是不給你正確的代碼,但指出你在正確的方向... – Nivas

1
<script language="javascript"> 
function validate() { 
    var chks = document.getElementsByName('sendto[]'); 
    var hasChecked = false; 
    for (var i = 0; i < chks.length; i++) { 
     if (chks[i].checked) { 
      hasChecked = true; 
      break; 
     } 
    } 
    if (hasChecked == false) { 
     alert("Please select at least one friend."); 
     return false; 
    } 
    return true; 
} 
</script> 
0

這是我該怎麼做的。

if(!validate()){ 
    alert("Please select at least one."); 
    return false; 
} 

function validate(){ 
    var els=document.getElementsByName('sendto[]'); 
    for(var i=0;i<els.length;i++){ 
    if(els[i].checked){ 
     return true; 
    } 
    } 
    return false; 
} 

您可以使用驗證作爲匿名函數。

+0

雖然嘗試此代碼,我收到此警告:警告:無效參數爲foreach() – Gurnor

+1

@Gurnor我沒有使用爲每個循環。你確定它在我的代碼?它似乎在爲我工作。是否有行號可以說明錯誤發生的位置? – qw3n