Ответ 1
Самое простое решение - просто не называть e.preventDefault()
, если проверка действительности не завершится. Переместите эту строку внутри внутреннего оператора if
и удалите последнюю строку функции с помощью .unbind().submit()
.
Я делаю некоторые простые проверки формы здесь и застрял в очень простой проблеме. У меня есть 5 пар полей для имени и входа (для регистрации ужина). Пользователь может вводить 1-5 пар, но при условии, что имя присутствует. Код:
<form>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
<input type="submit" value="Submit">
</form>
// Prevent form submit if any entrees are missing
$('form').submit(function(e){
e.preventDefault();
// Cycle through each Attendee Name
$('[name="atendeename[]"]', this).each(function(index, el){
// If there is a value
if ($(el).val()) {
// Find adjacent entree input
var entree = $(el).next('input');
// If entree is empty, don't submit form
if ( ! entree.val()) {
alert('Please select an entree');
entree.focus();
return false;
}
}
});
$('form').unbind('submit').submit();
});
Сообщение об ошибке работает, но оно отправляет форму каждый раз. Я знаю, что в этой строке что-то не так:
$('form').unbind('submit').submit();
... но я не уверен, что мне нужно делать.
Самое простое решение - просто не называть e.preventDefault()
, если проверка действительности не завершится. Переместите эту строку внутри внутреннего оператора if
и удалите последнюю строку функции с помощью .unbind().submit()
.
Используйте встроенный element.submit()
, чтобы обойти предупреждениеDefault в обработчике jQuery и обратите внимание, что оператор return возвращается только из каждого цикла, он не возвращается из обработчика событий
$('form').submit(function(e){
e.preventDefault();
var valid = true;
$('[name="atendeename[]"]', this).each(function(index, el){
if ( $(el).val() ) {
var entree = $(el).next('input');
if ( ! entree.val()) {
entree.focus();
valid = false;
}
}
});
if (valid) this.submit();
});
Проблема заключается в том, что даже если вы видите ошибку, ваш return false
влияет на обратный вызов метода .each()
... поэтому, даже если есть ошибка, вы достигаете строки
$('form').unbind('submit').submit();
и форма отправлена.
Вы должны создать переменную validated
, например, и установить ее в значение true. Затем в обратном вызове вместо return false
установите validated = false
.
Наконец-то...
if (validated) $('form').unbind('submit').submit();
Таким образом, только если ошибок нет, будет отправлена форма.
$('form').submit(function(e){
var submitAllow = true;
// Cycle through each Attendee Name
$('[name="atendeename[]"]', this).each(function(index, el){
// If there is a value
if ($(el).val()) {
// Find adjacent entree input
var entree = $(el).next('input');
// If entree is empty, don't submit form
if ( ! entree.val()) {
alert('Please select an entree');
entree.focus();
submitAllow = false;
return false;
}
}
});
return submitAllow;
});
Извините за задержку, но я постараюсь сделать идеальную форму:)
Я добавлю шаги проверки достоверности и проверяю каждый раз, а не .val()
. Проверьте .length
, потому что я думаю, что это лучший образец в вашем случае. Конечно, удалите функцию unbind
.
Конечно, исходный код:
// Prevent form submit if any entrees are missing
$('form').submit(function(e){
e.preventDefault();
var formIsValid = true;
// Count validation steps
var validationLoop = 0;
// Cycle through each Attendee Name
$('[name="atendeename[]"]', this).each(function(index, el){
// If there is a value
if ($(el).val().length > 0) {
validationLoop++;
// Find adjacent entree input
var entree = $(el).next('input');
var entreeValue = entree.val();
// If entree is empty, don't submit form
if (entreeValue.length === 0) {
alert('Please select an entree');
entree.focus();
formIsValid = false;
return false;
}
}
});
if (formIsValid && validationLoop > 0) {
alert("Correct Form");
return true;
} else {
return false;
}
});
Почему бы не связать событие кнопки отправки, кроме самой формы? было бы намного проще и безопаснее, если вы связываете кнопки, чем сама форма, так как форма будет в основном отправляться, если вы не будете использовать preventDefault()
$("#btn-submit").on("click", function (e) {
var submitAllow = true;
$('[name="atendeename[]"]', this).each(function(index, el){
// If there is a value
if ($(el).val()) {
// Find adjacent entree input
var entree = $(el).next('input');
// If entree is empty, don't submit form
if ( ! entree.val()) {
alert('Please select an entree');
entree.focus();
submitAllow = false;
return false;
}
}
});
if (submitAllow) {
$("#form-attendee").submit();
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form-attendee">
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
Name: <input name="atendeename[]">
Entree: <input name="entree[]"><br>
<button type="button" id="btn-submit">Submit<button>
</form>
На самом деле это, кажется, правильный путь:
$('form').submit(function(e){
//prevent default
e.preventDefault();
//do something here
//continue submitting
e.currentTarget.submit();
});