2015-09-07 52 views
0

我有一个表格,其中添加了多个动态行,并且我希望在提交表单之前对输入进行一些验证,例如,检查所有字段是否有输入等。 所以我把这个小功能,当我在我的提交按钮有一个onclick-事件:for循环中执行代码的问题

function validateAndSubmit() { 
var form = document.getElementById("mainForm"); 
var formGroups = document.getElementsByClassName("form-group"); 
for (var x in formGroups) { 
    // Validation goes here 
    .... 
    if (valid == false) { 
     return; 
    } 
} 
form.submit(); 

所以在我的逻辑,代码应该遍历每个表单组(这基本上代表了各行表格)并检查它们是否有效。在第一个无效行之后,函数将返回而没有任何结果。但是,如果所有formGroups都被选中,for-Loop将退出并且调用将提交表单。

但是,最终的提交没有发生。即使所有表单元素都有有效的输入,表单也不会提交。然而,在一些调试过程中,我将整个for循环注释掉了,表单提交了,但是当然没有验证。 所以我假设for-loop不能正常退出,并且可能需要一些帮助来解决这个问题。

整个项目是用纯Javascript编写的,但是,我正在使用库来动态地添加和删除项目到基于jQuery的表单。

仅供参考,你可以找到该项目的在线here

回答

2

你不应该在首位,在使用。只需使用简单形式:

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

请记住,for-in是用于对象/字典。例如。 {'key':'value'}

你在循环中获得的第一个“x”是“length” - 你的formGroups [x]变成了formGroups [undefined]并立即抛出异常。

+0

虽然你的答案是正确的,这是一个有趣的事情,那'在OP代码formGroups'实际上是一个对象,而不是一个数组。你能解释一下这个区别吗? – Teemu

+0

谢谢,您指出了一个有趣的事实:Array是javascript中的一种对象,.length()是Array对象的一种方法。正确的词应该是“for-in仅适用于词典...” –

+0

其实我是在[HTMLCollection](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCollection)之后是一个对象,而不是一个数组。 – Teemu

0

你也可以使用jQuery选择器来获取元素。在你的榜样,

$('.form-control').each(function() { 
    // Validation goes here 
    console.log($(this)); 
});