Выход не только из дочерней функции, но и из всей родительской функции
Короткие
Я хочу сделать следующее: сначала функция 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>
Ответы
Ответ 1
Добавьте флаг, который должен быть false для продолжения.
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();
})
});
Ответ 2
Мы можем разбить цикл $.each() на конкретной итерации, заставив функцию обратного вызова вернуть false. Возврат не-false - это то же самое, что и оператор continue в цикле for; он немедленно перейдет к следующей итерации.
Установите флаг в начале вашей проверки: var broken = false;
. Внутри each
, перед return false;
, добавьте broken = true;
. Затем после вашего кода each
добавьте if( broken) return false;
Ответ 3
Как это?
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;
}
Добавьте переменную, которая проверяет, являются ли условия истинными.