Javascript行为怪异

Javascript行为怪异,javascript,jquery,Javascript,Jquery,下面的函数不能像我认为的那样工作。出于某种原因,每当validate函数返回false时,循环就会中断。为什么呢 这是我的密码: function validateGroup(input) { if (!input.value.match(/^[0-9]{0,2}$/)) { $(input).addClass("invalidField"); return false; } $(input).removeClass("invalidFie

下面的函数不能像我认为的那样工作。出于某种原因,每当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;
}
函数验证组(输入){
如果(!input.value.match(/^[0-9]{0,2}$/){
$(输入).addClass(“invalidField”);
返回false;
}
$(输入).removeClass(“invalidField”);
返回true;
}
函数validateClass(输入){
如果(!input.value.match(/^[a-zA-Z0-9-]{0,9}$/){
$(输入).addClass(“invalidField”);
返回false;
}
$(输入).removeClass(“invalidField”);
返回true;
}
函数validateData(){
var rows=document.getElementsByTagName(“tbody”)[0].getElementsByTagName(“tr”);
var valid=true;
对于(变量i=0,arrayLength=rows.length;i

非常感谢

听起来这就是函数的意图。三行

valid = valid && validate...

这意味着,如果验证函数中的任何一个曾经点击false,那么valid将在循环的其余部分保持false。

听起来这就是该函数的意图。三行

valid = valid && validate...

这意味着,如果任何validate函数曾经命中false,则valid将在循环的其余部分保持false。

如果valid为false,则validate&&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已经知道结果为false,则不会费心计算表达式的其余部分。

如果valid为false,则语句valid&&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已经知道结果为false,则它不会费心计算&&表达式的其余部分。

看起来您希望在每次迭代中运行验证函数,即使“valid”已经设置为false。但是,您使用的&&操作将短路,因此尽管循环将继续,但在后续迭代中不会调用验证函数

一个非常简单的替代方案是:

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;
}
for(变量i=0,arrayLength=rows.length;i
看起来您希望在每次迭代中运行验证函数,即使“valid”已设置为false。但是,您使用的&&操作将短路,因此尽管循环将继续,但在后续迭代中不会调用验证函数

一个非常简单的替代方案是:

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;
}
for(变量i=0,arrayLength=rows.length;i
我认为这是因为Javascript与
&
一起使用的惰性评估方案。请尝试一个
&


我认为这是因为Javascript与
&
一起使用的惰性评估方案。请尝试一个
&


这叫做短路。快速修复:将每一行替换为

valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid;

这叫做短路。快速修复:将每一行替换为

valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid;


你说的“休息”是什么意思?当其中一个验证函数返回
false
时,答案将是
false
,因为您仅对其执行
&&
操作。哪个函数中断,哪个函数返回false?使用firebug并逐步检查是否存在javascript错误?(Firebug或safari的开发菜单会显示这一点)。我知道这仍然是错误的,但问题是,其他验证函数永远不会被调用……你所说的“中断”是什么意思?当其中一个验证函数返回
false
时,答案将是
false
,因为您仅对其执行
&&
操作。哪个函数中断,哪个函数返回false?使用firebug并逐步检查是否存在javascript错误?(Firebug或safari的开发菜单会显示这一点)。我知道它将保持为false,但问题是,其他验证函数从未被调用……当然,我希望valid保持为false,但其余的验证函数从未被调用,即使我仍然希望它们被调用!当然,我希望valid保持为false,但是其余的validate函数永远不会被调用,即使我仍然希望它们被调用!我知道&&运算符是如何工作的,但不知怎么的,我根本没有想到这一点!Aaarg,在短路操作中使用副作用。每个人都知道你不应该这样做,但事实仍然如此:)观察得真好!美好的我都没想到+1在短路操作中使用副作用通常是可取的,尤其是在检查某个对象是否为空以及是否为空的情况下,对其采取措施。只是在这个特殊的情况下,结果适得其反……我知道&&操作符是如何工作的,但不知何故,我根本没有想到这一点!Aaarg,在短路操作中使用副作用。每个人都知道你不应该这样做,但事实仍然如此:)观察得真好!美好的我都没想到+1在短路操作中使用副作用通常是可取的,尤其是在检查som是否存在的情况下