2011-09-08 103 views
3

我有一個腳本,通過class="validate"所有提交的元素循環,如果它們爲空,則取消提交併更改它們的背景顏色。任何人都知道一種方式,我可以在同一個函數中添加第二個驗證,以確保class="validate2"中的elemnets只是數字(無字)?這裏是我的腳本:只爲整數添加驗證?

<script type="text/javascript" > 
window.onload = function() { 
document.getElementById("formID").onsubmit = function() { 
    var fields = this.getElementsByClassName("validate"), 
     sendForm = true, 
     flag=false; 
    for(var i = 0; i < fields.length; i++) { 
     if(!fields[i].value) { 
      fields[i].style.backgroundColor = "#ffb8b8"; 
      flag=true; 

      sendForm = false; 
      window.scrollTo(0,0); 
     } 
     else { 
      fields[i].style.backgroundColor = "#fff"; 
     } 
    } 
if(!sendForm) { 
    return false; 
} 
</script> 
+0

你是否願意使用JQuery?如果是這樣看看validationEngine插件。 http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/我使用它。漂亮的插件。 – rlemon

+0

因爲這是一個'onload'函數 - 這個邏輯在服務器端不會更好嗎 - 即首先發送正確的HTML嗎? –

+0

@Ed其工作正常...... –

回答

1

試試這個方法:

<script type="text/javascript" > 
window.onload = function() { 
document.getElementById("formID").onsubmit = function() { 
    var fields = this.elements; 
    sendForm = true; 
    var flag=false; 

    for(var i = 0; i < fields.length; i++) { 
     if (fields[i].className == 'validate' || fields[i].className == 'validate2') { 
      alert(fields[i].className); 
      if (fields[i].value.length == 0) { 
       fields[i].style.backgroundColor = "#ffb8b8"; 
       flag=true; 
       sendForm = false; 
       window.scrollTo(0,0); 
      } 
      else if (fields[i].className == 'validate2' && isNaN(Number(fields[i].value))) { 
       fields[i].style.backgroundColor = "#ffb8b8"; 
       flag=true; 
       sendForm = false; 
       window.scrollTo(0,0); 
      } 
      else { 
       fields[i].style.backgroundColor = "#fff"; 
      } 
     } 
    } 

    if(!sendForm) { 
     return false; 
    } 
} 

}

+0

我已經有這種方式不使用**兩個用於**循環以獲得更好的性能 – 2011-09-08 17:59:20

+0

幾乎工作..兩個問題.. 1.這隻對validate2有效,validate1不做任何事情。2.它只驗證一次。即,如果我提交,它會驗證,但是下次我提交時,即使我沒有更改任何內容,也會提交表單。 –

+0

但我提出只有一個循環的想法 –

1

替換:

if(!fields[i].value) 

if(+fields[i].value || +fields[i].value === 0) 
在你的第二個驗證

。基本上將該值轉換爲數字。如果它繼續有效。

var fields = this.getElementsByClassName("validate"), 
    fields2 = this.getElementsByClassName("validate2"), 
    sendForm = true, 
    flag=false; 
for(var i = 0; i < fields.length; i++) { 
    if(!fields[i].value) { 
     fields[i].style.backgroundColor = "#ffb8b8"; 
     flag=true; 

     sendForm = false; 
     window.scrollTo(0,0); 
    } 
    else { 
     fields[i].style.backgroundColor = "#fff"; 
    } 
} 
for(var i = 0; i < fields2.length; i++) { 
    if(+fields2[i].value && +fields2[i].value === 0) { 
     fields2[i].style.backgroundColor = "#ffb8b8"; 
     flag=true; 

     sendForm = false; 
     window.scrollTo(0,0); 
    } 
    else { 
     fields2[i].style.backgroundColor = "#fff"; 
    } 
} 

if(!sendForm) { 
    return false; 
} 
+0

但我在哪裏把第二個驗證? Im not great with js .. –

+0

我已經更新了我的回答 – Joe

+0

感謝您的時間,但仍然沒有很好的工作..即時通訊ganna走向jQuery的方向。 –

0

基本上你帶類的元素做了同樣的用類「validate2」元素「驗證」了,但是檢查該值是一個數字(通過正則表達式完成)。 注意 - 如果你的字段有兩個類,你可能需要添加更多的邏輯。

var fields = this.getElementsByClassName("validate"), 
    numfields = this.getElementsByClassName("validate2"), 
    sendForm = true; 
var flag=false; 
for(var i = 0; i < fields.length; i++) { 
    if(!fields[i].value) { 
     fields[i].style.backgroundColor = "#ffb8b8"; 
     flag=true; 
     sendForm = false; 
     window.scrollTo(0,0); 
    } 
    else { 
     fields[i].style.backgroundColor = "#fff"; 
    } 
} 
for(var i = 0; i < numfieldsfields.length; i++) { 
    if((numfields[i].value.search(/^\s*\d+\s*$/) != -1) { 
     numfields[i].style.backgroundColor = "#ffb8b8"; 
     flag=true; 
     sendForm = false; 
     window.scrollTo(0,0); 
    } 
    else { 
     numfields[i].style.backgroundColor = "#fff"; 
    } 
} 

if(!sendForm) { 
    return false; 
} 
0

這可能會奏效 -

window.onload = function() { 
    document.getElementById("formID").onsubmit = function() { 
     var fields = this.getElementsByClassName("validate"), 
      sendForm = true, 
      flag = false; 
     for (var i = 0; i < fields.length; i++) { 
      if (!fields[i].value) { 
       fields[i].style.backgroundColor = "#ffb8b8"; 
       flag = true; 

       sendForm = false; 
       window.scrollTo(0, 0); 
      } 
      else { 
       fields[i].style.backgroundColor = "#fff"; 
      } 
      if (hasClass(fields[i], "numeric")) { 
       if (!isInteger(fields[i].value)) { 
        fields[i].style.backgroundColor = "#ffb8b8"; 
        flag = true; 

        sendForm = false; 
        window.scrollTo(0, 0); 
       } 


       if (!sendForm) { 
        return false; 
       } 
      } 
     } 
    } 
} 

var isInteger_re = /^\s*(\+|-)?\d+\s*$/; 

function isInteger(s) { 
    return String(s).search(isInteger_re) != -1 
} 

function hasClass(element, cls) { 
    return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1; 
} 

沒什麼太花哨,它只是檢查是否該元素具有類「數字」然後運行就可以了正則表達式來看看它的一個整數。魔術在這裏發生......

var isInteger_re = /^\s*(\+|-)?\d+\s*$/; 

    function isInteger(s) { 
     return String(s).search(isInteger_re) != -1 
    } 

    function hasClass(element, cls) { 
     return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1; 
    } 

所以用下面的輸入應該得到回升...

<input type='text' class='required numeric' /> 

在我看來這是值得采用某種框架或插件,以避免重新在這裏發明車輪。我相信有這麼多的可行的輕量級候選人。就我個人而言,我使用jQuery,因此使用bassistance validation是一件簡單的事情,我可以擴展並且非常易於使用。

乾杯!

-Derek

+0

如果我不能得到任何工作,虐待使用這種幫助驗證。看起來很棒。 –