it-swarm.com.ru

Проверка HTML5 перед отправкой ajax

Это должно быть просто, но это сводит меня с ума. У меня есть html5 форма, которую я отправляю с ajax. Если вы введете неверное значение, появится всплывающий ответ, который сообщит вам об этом. Как я могу проверить правильность записей перед тем, как запустить AJAX-отправку? 

форма:

<form id="contactForm" onsubmit="return false;">
  <label for="name">Name:</label>
  <input type="text" name="name" id="name" required placeholder="Name" />
  <label for="subject">Subject:</label>
  <input type="text" name="subject" id="subject" required placeholder="Subject" />
  <label for="email">Email:</label>
  <input type="email" name="email" id="email" required placeholder="[email protected]" />
  <label for="message">Message:</label>
  <textarea name="message" id="message" required></textarea>
  <input type="submit" id="submit"/>
</form>

отправить:

$('#submit').click(function(){
    var name = $("input#name").val();
    var subject = $("input#subject").val();
    var email = $("input#email").val();
    var message = $("input#message").val();

    var dataString = 'email=' + email + '&message=' + message + '&subject=' + subject + '&name=' + name ; 

    $.ajax({
        url: "scripts/mail.php",
        type:   'POST',
        data: dataString,
        success: function(msg){
            disablePopupContact();
            $("#popupMessageSent").css("visibility", "visible");
        },
        error: function() {
            alert("Bad submit");
        }
    });
});
32
Sorry-Im-a-N00b

По умолчанию jQuery ничего не знает о проверке HTML5, поэтому вам нужно сделать что-то вроде:

$('#submit').click(function(){
    if($("form")[0].checkValidity()) {
        //your form execution code
    }else console.log("invalid form");
});
47
antinescience

Если вместо щелчка вы связываетесь с событием отправки, оно срабатывает только в том случае, если оно проходит проверку HTML5.

Рекомендуется кэшировать ваши селекторы jQuery в переменных, если вы используете его несколько раз, чтобы вам не приходилось перемещаться по DOM при каждом доступе к элементу. jQuery также предоставляет функцию .serialize (), которая будет обрабатывать данные формы для вас.

var $contactForm = $('#contactForm');

$contactForm.on('submit', function(ev){
    ev.preventDefault();

    $.ajax({
        url: "scripts/mail.php",
        type:   'POST',
        data: $contactForm.serialize(),
        success: function(msg){
            disablePopupContact();
            $("#popupMessageSent").css("visibility", "visible");
        },
        error: function() {
            alert("Bad submit");
        }
    });
});
41
csbarnes

Если вы используете проверку формы HTML5, вам необходимо отправить запрос ajax в обработчике отправки формы. Обработчик отправки будет срабатывать, только если форма проверена. То, что вы используете, - это обработчик нажатия кнопки, который всегда срабатывает, потому что он не связан с проверкой формы. ПРИМЕЧАНИЕ: не все браузеры поддерживают проверку формы html5.

4
Musa

Я предпочитаю использовать обработчик отправки jQuery, вы все равно получите ответ на свою форму следующим способом.

jQuery('#contactForm').on('submit', function (e) {
    if (document.getElementById("contactForm").checkValidity()) {
        e.preventDefault();
        jQuery.ajax({
            url: '/some/url',
            method: 'POST',
            data: jQuery('#contactForm').serialize(),
            success: function (response) {
                //do stuff with response
            }
        })
    }
    return true;
});
1
Mfoo

Не совсем уверен, что вы имеете в виду. Но я предполагаю, что вы хотите проверить в режиме реального времени, если вход действителен. Если это так, вы должны использовать .keyup вместо события .click, потому что это приведет к действию, если пользователь нажмет submit. Посмотрите на http://api.jquery.com/keyup/

При этом вы можете проверять ввод с каждым новым символом, вставлять и отображать, например, "не действителен", пока ваша проверка не станет правдой. 

Надеюсь, это ответит на ваш вопрос! 

0
Kurt