2014-10-04 93 views
2

我的網頁即使顯示提示信息並且返回錯誤代碼顯然存在,它仍會一直提交。我在這裏做錯了什麼?提交後留在同一頁

 function validateForm() { 
     var selected = ""; 
     var radios = document.getElementsByName("special"); 
     var len = document.getElementsByName("special").length; 
     var i; 

     for (i = 0; i < len; i++) { 
      if(radios[i].checked) { 
       selected = radios[i].value; 
       break; 
      } 
      if(selected == "") { 
       alert("Must select option."); 
       return false; 
      } 
      else { 
       return true; 
      } 
     } 
    } 

    <form action="FormProcessor.html" method="post" onreset="blank();" onsubmit="validateForm();" name="myForm"> 
      <p>Would you like special offers sent to you e-mail?</p> 
      <input type="radio" name="special" value="Yes"/>Yes 
      <input type="radio" name="special" value="No"/>No<br/> 
      <input type="submit"/> 
      <input type="reset"/> 
    </form> 

回答

4

你只是這樣說

onsubmit="return validateForm();" 

代替

onsubmit="validateForm();" 

updated demo

那是因爲你在for循環檢查的selected值,所以對於第一次它的價值是""第二次它變成No

+0

謝謝!有效!現在,查看代碼,您是否可以解釋爲什麼即使選中「否」選項也會顯示警報(「必須選擇選項」)? – 2014-10-04 02:42:23

+0

謝謝!什麼是更好的方式來編寫這段代碼然後才能正確工作? – 2014-10-04 02:50:59

+0

是的。我沒有看到代碼的任何更改,但要使其正常工作?我錯過了什麼嗎? – 2014-10-04 02:54:56

2

在您提交處理程序,而不是return false,使用event.preventDefault

function validateForm (event) { 
... 
     if(selected == "") { 
      alert("Must select option."); 
      event.preventDefault(); 
     } 

你必須做更多的事情來支持IE8。

event.preventDefault ? event.preventDefault() : event.returnValue = false; 

或者,你可以改變onsubmit屬性是return validateForm()。這既會阻止默認操作並停止事件傳播,也不會阻止默認操作。

+0

謝謝!我結束了使用返回validateForm()。這是一個快速簡單的修復!您是否知道爲什麼它會一直顯示警報(「必須選擇選項」),即使選中「否」選項? – 2014-10-04 02:47:19

+0

你的循環邏輯是這樣的,它在第一次通過時觸發警報,如果沒有檢查第一個項目而不是在遍歷所有內容後觸發警報。 – Trott 2014-10-04 04:56:22

0

您錯過了在窗體中的onsubmit()方法之前寫入return。

onsubmit="return validateForm();" 

當您在onSubmit()的方法調用之前沒有寫入return時,那麼javascript無法將頁面返回到表單中。