【发布时间】:2011-12-05 13:05:56
【问题描述】:
我正在使用 javascript 来验证一些表单元素。提交表单时,我需要的字段将传递到我的 validateReqFields 函数中。一切正常,直到我进入 for 循环,该循环旨在在表单字段旁边添加一个空的错误消息。似乎只要一个字段失败并将消息添加到 div,for 循环就不会继续。
HTML 表单元素:
First Name <input type="text" name="firstName" onkeypress="return checkField(event, letters);"/><div id="firstNameMsg" style="display:inline-block;"></div>
<br>
Last Name <input type="text" name="lastName" onkeypress="return checkField(event, letters);"/><div id="lastNameMsg" style="display:inline-block;"></div>
Javascript函数:
function validateReqFields(formName, reqFields){
var fieldArray = reqFields.split(",");
var failedList = new Array();
var message = "Required Field";
for(var i=0; i<fieldArray.length; i++){
removeWhiteSpace(fieldArray[i]);
var s = eval('document.'+formName+'.'+fieldArray[i]+'.value');
if(s.length<1) { failedList.push(fieldArray[i]); }
}
if(failedList.length >= 1) {
for(var i=0; i<failedList.length; i++) {
//BUG - Only shows first failed field.
document.getElementById(failedList[i] + 'Msg').innerHTML = message;
}
} else {
document.mForm.submit();
}
}
function removeWhiteSpace(mString){
mString = mString.replace(/(^\s+|\s+$)/g,' ');
return mString;
}
我做了一些测试并得出结论,当 for 循环在第一个 div 元素上设置 innerHtml 时,它会中断 for 循环。有没有办法避免这种情况?
【问题讨论】:
-
我猜是因为您在扫描的位置更改了 DOM。只是好奇,但为什么不使用 jQuery 让您的生活更轻松?
-
Javascript 对我来说是新的,我更愿意在使用 jQuery 简化事情之前先了解具体细节。
-
如果使用 [] 属性访问符号,可以避免滥用 eval:
document[formName][fieldArray[i]].value -
使用 eval 似乎是在不提前结束 for 循环的情况下调用表单元素的唯一方法。我还得出结论,调用 document.getElementById('elementID') 也会导致循环只运行一次。
-
你在 FF、Chome、IE 上进行测试吗?一些浏览器对用户隐藏 javascript 错误(IE 不这样做),如果您的代码抛出一些错误,则循环(以及之后的所有内容)将被中止。如果您使用的是 FF,请尝试 FireBug,对于 Chrome,只需按 F12。
标签: javascript forms for-loop innerhtml