2011-09-08 105 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

如果我不能得到任何工作,虐待使用这种帮助验证。看起来很棒。 –