使用Javascript和“未定义”问题进行表单验证

时间:2011-01-17 14:05:45

标签: javascript jquery validation

我使用下面的代码构建表单验证。它工作但是如果填充了一些必填字段,则var msg包含未定义的值。

例如,如果填写了用户名,但密码不包含var msg 'undefinied' 需要字段

如何避免?

以下是代码:

var i = 0;
var error_msg = [];
var msg = ;

var errors = {
    'username' : 'Field is required',
    'password' : 'Field is requred',
    'city'     : 'City is required'
    etc...... etc... 
};

for(var x in errors) {
    i++;
    if(!$('#'+x).val()) {
        error_msg[i] = errors[x];
    }   
}
if(error_msg.length > 0) {

    for(var x = 0; x < errors_msg.length; x++) {

        msg += errors_msg[x] +"\n";
    }
}

3 个答案:

答案 0 :(得分:4)

我看到的一件事是:

var msg = ;

应该(可能)

var msg = "";

您是否也尝试过:

alert($('#'+x).length);

看看jQuery是否找到了元素? (如果它返回0,则表示未找到)

答案 1 :(得分:2)

好的,除了明显损坏的for in循环和msg的缺失分配。

这是您的实际问题:

var error_msg = []; // new empty array

for(var x in errors) {
    i++; // i starts with 1 this way!
    // other code
}

所以你永远不会设置0索引。是数组以索引0开头。因此,如果您设置的索引大于数组的当前长度,JavaScript将在该索引之前插入缺少的元素。

在您的情况下,JavaScript会在索引undefined处插入默认0,因为您设置的第一个索引是1

<强>修复

var error_msg = [];
for(var x in errors) {
    if (errors.hasOwnProperty(x)) { // see note below
        if(!$('#'+x).val()) {
            error_msg.push(errors[x]); // append to the array
        }
    }
}

var msg = error_msg.join('\n'); // no need for an if, will be empty if there are no errors.

注意:请参阅hasOwnProperty

答案 2 :(得分:0)

这不是你的问题,所以这不是一个真正的答案,但评论不能很好地支持代码:

if(error_msg.length > 0) {

    for(var x = 0; x < errors_msg.length; x++) {

        msg += errors_msg[x] +"\n";
    }
}

为了将来参考,您永远不需要编写该代码:

msg = errors_msg.join('\n');

做同样的事情。