#javascript #jquery #ajax
#javascript #jquery #ajax
Вопрос:
У меня возникли некоторые проблемы с простой формой. Кажется, я не могу запретить отправку формы, если поля пусты. Есть ли простой способ проверить, пусты ли поля, а затем запретить отправку формы?
Вот моя html-форма:
<form method="post" name="simpleForm" id="simpleForm" action="handler.php">
<fieldset>
<legend>Info</legend>
<p><label for="name">Name</label><br>
<input id="name" name="name" class="text" /></p>
<p><label for="email">Email</label><br>
<input id="email" name="email" class="text" /></p>
<legend>Questions</legend>
<p><label for="qs_1">Question 1</label><br>
<input id="qs_1" name="qs_1" class="text" /></p>
<p><label for="qs_2">Question 2</label><br>
<input id="qs_2" name="qs_2" class="text" /></p>
<p><label for="qs_3">Question 3</label><br>
<input id="qs_3" name="qs_3" class="text" /></p>
</fieldset>
<p><input type="submit" name="submit" value="Send" id="sub_btn" /></p>
</form>
Вот мой javascript:
$("form#simpleForm").submit(function() {
var name = $('#name').attr('value');
var email = $('#email').attr('value');
var qs_1 = $('#qs_1').attr('value');
var qs_2 = $('#qs_2').attr('value');
var qs_3 = $('#qs_3').attr('value');
$.ajax({
type: "POST",
url: "handler.php",
data: "name=" name "amp; email=" email "amp; qs_1=" qs_1 "amp; qs_2=" qs_2 "amp; qs_3=" qs_3,
success: function(){
$('form#simpleForm').hide(function(){$('div.success').fadeIn();});
}
});
return false;
});
Комментарии:
1. не использовать
$('#name').attr('value')
, а использовать$('#name').val()
2. Вместо того , чтобы использовать
.attr('value')
, вместо этого используйте.val()
. Улучшенная кроссбраузерная совместимость.
Ответ №1:
Используется e.preventDefault()
для отмены отправки формы. Если вы не хотите отправлять вызов AJAX, добавьте проверку условий. Кроме того, используйте .val()
вместо .attr("value")
.
$("form#simpleForm").submit(function(ev) {
ev.preventDefault();
var name = $('#name').val();
var email = $('#email').val();
var qs_1 = $('#qs_1').val();
var qs_2 = $('#qs_2').val();
var qs_3 = $('#qs_3').val();
//This condition will only be true if each value is not an empty string
if(name amp;amp; email amp;amp; qs_1 amp;amp; qs_2 amp;amp; qs_3){
$.ajax({
type: "POST",
url: "handler.php",
data: "name=" name "amp; email=" email "amp; qs_1=" qs_1 "amp; qs_2=" qs_2 "amp; qs_3=" qs_3,
success: function(){
$('form#simpleForm').hide(function(){$('div.success').fadeIn();});
}
});
}
return false; //IE
});
Комментарии:
1. Функция preventDefault() не работает в IE, для IE используйте event.cancelBubble = true;
2.
return false;
, который уже был у запрашивающего, должен делать то же самое. Вопрос был о том, как предотвратить отправку, если какие-либо / все поля пусты.3. @GregL Preventdefault был дополнительным. Я предложил 3 изменения в своем ответе.
4. @RobW, я, должно быть, слепой, я изначально думал, что ваш ответ был неправильным, но я явно ошибался. Приношу свои извинения, сэр.
5. Работает отлично! Многому научился из этого. Спасибо!
Ответ №2:
В общем смысле, если вы вернете false из обработчика отправки, это предотвратит отправку формы стандартным (не ajax) способом, но я вижу, что вы уже делаете это — что вам нужно, если вы хотите отправить его через ajax вместо этого, или он вызовет ajax и отправит обычно.
Итак, все, что вам нужно для вашей проверки, это установить тест if, который выполняет $.ajax()
вызов только в том случае, если проверка прошла успешно:
if (name != "" amp;amp; etc...) {
$.ajax({ /* your existing ajax code here */ });
}
РЕДАКТИРОВАТЬ: вы также можете проверить, нет ли пустых полей с помощью одного селектора jQuery:
if ($("#simpleform :text[value='']").length === 0) {
$.ajax({ /* your existing ajax code here */ });
}
Ответ №3:
Просто проверьте if перед отправкой ajax-запроса:
if(name != '' amp;amp; email != '' ...)
{
//send request is true
$.ajax({
type: "POST",
url: "handler.php",
data: "name=" name "amp; email=" email "amp; qs_1=" qs_1 "amp; qs_2=" qs_2 "amp; qs_3=" qs_3,
success: function(){
$('form#simpleForm').hide(function(){$('div.success').fadeIn();});
}
});
}
else{
return false;
}
Комментарии:
1. Хорошая попытка, но обратите внимание на замечание, сделанное в других ответах — вам нужно возвращать false независимо от того, выполняется условие if или нет, в противном случае форма выполнит обычную отправку, что, вероятно, нежелательно.
Ответ №4:
Вот очень простая функция, позволяющая сделать форму недействительной, если какой-либо из входных данных пуст:
function validateForm(data){
var is_valid = true;
$.each(data, function(id, obj) {
if(obj.value === "") {
is_valid = false;
}
});
return is_valid;
}
data
Аргумент должен быть сериализованной формой json.
Использование:
var form_data = $( "#my_form" ).serializeArray();
var is_valid = validateForm(form_data);
if(is_valid === true){
// your ajax code
}