Javascript表现得很奇怪

时间:2009-12-16 15:17:50

标签: javascript jquery

以下功能无法正常工作。出于某种原因,只要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;
}

非常感谢!

5 个答案:

答案 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;