Выход не только из дочерней функции, но и из всей родительской функции - PullRequest
30 голосов
/ 24 февраля 2012

Short

Я хочу сделать следующее: сначала функция validate() должна проверять все входы один за другим: если они не пусты (или пропущены), затем перейти к оператору if (для проверки переключателей) Но если некоторые из пустые входы, затем остановка всей функции проверки и фокус на пустом вводе.

Вот результат: http://jsfiddle.net/tt13/y53tv/4/

Просто нажмите кнопку ok, вы увидите, что она закончила первую функцию и сработает, если тоже. Но я хочу выйти из всей функции validate (), если есть пустое поле, а не только из каждой функции ()

Подробная

JS

function validate() {
    $('.var_txt').each(function() {
        if ($.trim($(this).val()) == '') {
            $(this).focus();
            return false;
        }
    });

    if (!$(".answer:checked").val()) {
        alert("boom");
        return false;
    }
    return true;
}
$(document).ready(function() {
    $("#add_question").submit(function(e) {
        if (validate()) {
            alert("good");
        }
        e.preventDefault();
    })
});​

HTML-разметка

 <form id="add_question" method="post" action=""> 
 <table>

                  <tr>

                    <td class="var_label">

                      <input class="answer" type="radio" name="answer" value="a" /> a)

                    </td>

                    <td>

                      <input type="text" class="var_txt" name="var_a" />

                    </td>

                  </tr>

                  <tr>

                    <td class="var_label">

                      <input class="answer" type="radio" name="answer" value="b" /> b)

                    </td>

                    <td>

                      <input type="text" class="var_txt" name="var_b" />

                    </td>

                  </tr>

                  <tr>

                    <td class="var_label">

                      <input class="answer" type="radio" name="answer" value="c" /> c)

                    </td>

                    <td>

                      <input type="text" class="var_txt" name="var_c" />

                    </td>

                  </tr>

                  <tr>

                    <td class="var_label">

                      <input class="answer" type="radio" name="answer" value="d" /> d)

                    </td>

                    <td>

                      <input type="text" class="var_txt" name="var_d" />

                    </td>

                  </tr>

                  <tr>

                    <td class="var_label">

                      <input class="answer" type="radio" name="answer" value="e" /> e)

                    </td>

                    <td>

                      <input type="text" class="var_txt" name="var_e" />

                    </td>

                  </tr>

                </table>
<input type="submit" name="submit" value="ok" />

</form>

Ответы [ 3 ]

22 голосов
/ 24 февраля 2012

Добавьте флаг, который должен быть ложным, чтобы продолжить.

function validate() {
    var invalid = false;
    $('.var_txt').each(function() {
        if ($.trim($(this).val()) == '') {
            $(this).focus();
            invalid = true;
            return false;
        }
    });
    if (invalid) {
        return false;
    }

    if (!$(".answer:checked").val()) {
        alert("boom");
        return false;
    }
    return true;
}
$(document).ready(function() {
    $("#add_question").submit(function(e) {
        if (validate()) {
            alert("good");
        }
        e.preventDefault();
    })

});​
4 голосов
/ 24 февраля 2012

Мы можем разорвать цикл $ .each () на определенной итерации, заставив функцию обратного вызова вернуть false. Возвращение non-false - это то же самое, что и оператор continue в цикле for; он сразу перейдет к следующей итерации.

Установите флаг в начале вашей проверки: var broken = false;. Внутри each, перед return false;, добавьте broken = true;. Затем после вашего each кода добавьте if( broken) return false;

1 голос
/ 24 февраля 2012

Как это?

function validate() {
    var pass = true;
    $('.var_txt').each(function() {
        if ($.trim($(this).val()) == '') {
            $(this).focus();
            pass = false;
            return false;
        }
    });

    if (!$(".answer:checked").val()) {
        alert("boom");
        pass = false;
        return false;
    }
    return pass;
}

Добавьте переменную, которая проверяет, выполняются ли условия.

...