以下功能无法正常工作。出于某种原因,只要validate函数返回false,循环就会中断。那是为什么?
这是我的代码:
function validateGroup(input) {
if (!input.value.match(/^[0-9]{0,2}$/)) {
$(input).addClass("invalidField");
return false;
}
$(input).removeClass("invalidField");
return true;
}
function validateClass(input) {
if (!input.value.match(/^[a-zA-Z0-9-]{0,9}$/)) {
$(input).addClass("invalidField");
return false;
}
$(input).removeClass("invalidField");
return true;
}
function validateData() {
var rows = document.getElementsByTagName("tbody")[0].getElementsByTagName("tr");
var valid = true;
for (var i = 0, arrayLength = rows.length; i < arrayLength; ++i) {
valid = valid && validateClass(rows[i].getElementsByTagName("input")[0]);
valid = valid && validateGroup(rows[i].getElementsByTagName("input")[1]);
valid = valid && validateGroup(rows[i].getElementsByTagName("input")[2]);
}
return valid;
}
非常感谢!
答案 0 :(得分:12)
声明有效&amp;&amp;如果valid为false,validateClass(...)将不会调用validateClass方法。我想你想要做的是改变那些的顺序
valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid;
valid = validateGroup(rows[i].getElementsByTagName("input")[1]) && valid;
valid = validateGroup(rows[i].getElementsByTagName("input")[2]) && valid;
Javascript并不打算评估&amp;&amp ;;的其余部分。表达式,如果它已经知道结果为假。
答案 1 :(得分:2)
看起来你想在每次迭代时运行验证函数,即使'valid'已经设置为false。然而&amp;&amp;您正在使用的操作会短路,因此虽然循环将继续,但在后续迭代中不会调用验证函数。
一个非常简单的替代方案,可以按照你想要的方式工作:
for (var i = 0, arrayLength = rows.length; i < arrayLength; ++i) {
if(!validateClass(rows[i].getElementsByTagName("input")[0])) valid = false;
if(!validateGroup(rows[i].getElementsByTagName("input")[1])) valid = false;
if(!vvalidateGroup(rows[i].getElementsByTagName("input")[2])) valid = false;
}
答案 2 :(得分:0)
听起来这是该功能的意图。
的三行valid = valid && validate...
表示如果任何验证函数遇到错误valid
将在循环的其余部分保持为假。
答案 3 :(得分:0)
我认为这是因为Javascript与&&
一起使用的延迟评估方案。请尝试使用单个&
。
Short-circuit evaluation: Support in common programming languages
答案 4 :(得分:0)
这叫做短路。快速修复:用
替换每一行valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid;