我使用下面的代码构建表单验证。它工作但是如果填充了一些必填字段,则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";
}
}
答案 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');
做同样的事情。