Использование AJAX для проверки формы требует двух нажатий на кнопку Отправить


Я использую вызов AJAX для проверки поля электронной почты в форме. Это необходимо, потому что мне нужно проверить, если адрес электронной почты уже взят. После того, как моя первая попытка вызвала бесконечный цикл запросов ajax, я нашел это решение, которое, кажется, работает нормально.

Кроме того: мне нужно нажать кнопку Отправить дважды, прежде чем форма действительно отправится. У кого-нибудь есть идея, почему это так?

Это минимальный пример моего кода js:

$('form').submit(function(event){
    event.preventDefault();
    $.post('/echo/json', {'mail': $('#test').val()}, function(data){
        //decide if valid or not based on data
        //we assume it's valid an want to submit the form now!
        $('form').unbind().submit();

        //we should only see this for a very short time
        $('.info').text('should have already submitted');
    }, 'json');
});

Здесь есть jsfiddle .

Править: Простите, я не совсем ясно выразился. Я вставил несколько комментариев, чтобы прояснить ситуацию.: Я хочу использовать ответ на запрос AJAX, чтобы решить, отправлять ли форму или нет, и показать ошибку, если нет. Не отправка работает хорошо, но если адрес электронной почты действителен, требуется два клика на submit, чтобы действительно отправить. Пример имитирует этот случай.

unbind() необходимо, потому что в противном случае я создам бесконечный цикл ({2]} будет вызван снова). Также jQuery.пост() является асинхронный вызов event.preventDefault() внутри обработчика успеха не будет работать, потому что форма уже была бы отправлена.

1 2

1 ответ:

Может быть, это то, что вам нужно?

Открепите submit обработчик событий и затем триггер $('#submit') Нажмите:

$('form').submit(function(event){
    event.preventDefault();
    $.post('/echo/json', {'mail': $('#test').val()}, function(data){
        $('form').unbind('submit').find('#submit').trigger('click');
        $('.info').text('should have already submitted');
    }, 'json');
});

Демо-версия


В качестве альтернативы используйте .one() обработчик событий (так что этот обработчик срабатывает только один раз), а затем триггер $('#submit') щелкает, так что форма передается обычным способом после ответа AJAX.

$('form').one('submit',function(event){
    event.preventDefault();
    $.post('/echo/json/', {action : 'checkmail_action', mail : $('#test').val()}, function(data){
        //if(data == 'e-mail is valid'){
            $('#submit').trigger('click');
        //}
        $('.info').text('should have already submitted');
    }, 'json');
});

Демо-версия

Или, если вам снова нужно отправить событие, вы можете обернуть обработчик событий .one() в функцию:

function ajaxCheck(){
    $('form').one('submit',function(event){
        event.preventDefault();
        $.post('/echo/json/', {action : 'checkmail_action', mail : $('#test').val()}, function(data){
            if(data == 'e-mail is valid'){
                // submit the form without AJAX:
                $('#submit').trigger('click');
            }else{
                // rebind submit handler, so that e-mail can be validated with AJAX again:
                ajaxCheck();
            }
            $('.info').text('should have already submitted');
        }, 'json');
    });
}
// bind single submit handler:
ajaxCheck();

ПС. Не используйте кавычки на ключах AJAX data.