Javascript ведет себя странно - PullRequest
1 голос
/ 16 декабря 2009

следующая функция не работает, как я и думал. По какой-то причине цикл прерывается всякий раз, когда одна из функций 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 ]

12 голосов
/ 16 декабря 2009

оператор valid && validateClass (...) не будет вызывать метод validateClass, если valid равен false. Я думаю, что вы хотите изменить их порядок на

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 не утруждает себя оценкой остальной части выражения &&, если он уже знает, что результат ложен.

2 голосов
/ 16 декабря 2009

Похоже, что вы хотите запускать проверяющие функции на каждой итерации, даже если для '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;
}
0 голосов
/ 16 декабря 2009

Это называется коротким замыканием. Быстрое исправление: замените каждую строку на

valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid;
0 голосов
/ 16 декабря 2009

Я думаю, что это из-за ленивой оценки схемы, которую Javascript использует с &&. Попробуйте вместо &.

Оценка короткого замыкания: поддержка общих языков программирования

0 голосов
/ 16 декабря 2009

Похоже, что это цель функции. Три строки

valid = valid && validate...

означает, что если какая-либо из функций проверки когда-либо попадет в ложь, valid останется ложью до конца цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...