Форма отправки не останавливается в JQuery AJAX вызова - PullRequest
8 голосов
/ 30 апреля 2009

Я получил следующий код:

$.ajax({
    type: "POST",
    async: false,              
    url: "CheckIdExist",
    data: param,
    success: function(result) {
        if (result == true){
            return false;
        }                                 
    },
    error: function(error) {
        alert(error);
        return false;
    }
});

если возвращаемое значение ajax равно true, форма должна прекратить отправку.

но это не останавливает отправку формы.

любая помощь, пожалуйста.

Ответы [ 6 ]

15 голосов
/ 30 апреля 2009

Я полагаю, у вас есть что-то вроде:

form.submit(function(event) {
    $.ajax(...);
});

Вы хотите return false (или вызвать event.preventDefault()) в самой функции обработки событий, а не в вызове AJAX, например:

form.submit(function(event) {
    $.ajax(...);
    event.preventDefault();
});
7 голосов
/ 27 августа 2010

Небольшое изменение этого вопроса: Я хочу использовать jquery и ajax, чтобы представить сообщение об ошибке пользователю, но затем выполнить обычную обработку, если нет ошибки.

Предположим, что метод "check" возвращает ответ, который является пустым, если ошибки нет, и содержит ошибки, если таковые имеются.

Затем вы можете сделать что-то подобное в своей функции готовности:

$("#theform").submit(function() {
    var data = { ... }
    $.get('/check', data,
        function(resp) {
            if (resp.length > 0) {
                $("#error").html(resp);
            } else {
                $("#theform").unbind('submit');
                $("#theform").submit();
            }
    });
    event.preventDefault();
});

Итак, как это работает? Когда запускается внешняя функция submit, она строит данные, необходимые для вызова AJAX (здесь функция get более высокого уровня). Вызов запланирован, и основной поток операций немедленно продолжается, но отправка безоговорочно прекращается, поэтому ничего очевидного не происходит.

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

Однако, если ответ пуст, функция отправки не связана. Это предотвращает дополнительный вызов системы через внешнюю функцию отправки. Внутренняя функция отправки вызывается. Это запускает фактическую отправку формы к цели формы, и жизнь продолжается, как и ожидалось.

2 голосов
/ 30 апреля 2009

Вам нужно сделать обратный звонок.

Эта запись в FAQ очень помогла мне, когда у меня возникла именно эта проблема.

getUrlStatus('getStatus.php', function(status) {
    alert(status);
});

function getUrlStatus(url, callback) {
    $.ajax({
        url: url,
        complete: function(xhr) {
            callback(xhr.status);
        }
    });
}

Причина в том, что вы не можете вернуться в функцию AJAX.

Приведенный выше код не работает должным образом из-за характера асинхронного программирования. Предоставленный обработчик успеха вызывается не сразу, а скорее в какое-то время в будущем, когда ответ получен с сервера. Поэтому, когда мы используем переменную 'status' сразу после вызова $ .ajax, ее значение все еще не определено.

1 голос
/ 12 августа 2009

У меня тоже была эта проблема, но я решил ее, изменив тип ввода = submit на type = button, а затем просто выполнил ваш ajax-запрос

   $("input#submitbutton")
    {
                          $.ajax(
                        {                         type: "POST",
                             async: false,              
                            url: "CheckIdExist",
                             data: param,
                            success: function(result) {
                                 if (result == true){
                                    //TODO: do you magic
                                 }                      
                                 else
                                  $("form").submit();           
                             },
                             error: function(error) {
                                alert(error);
                                return false;
                            }
                        });
    });
1 голос
/ 30 апреля 2009

Вы не можете поместить этот код в функцию или в отправку формы, функция успеха возвращает свой результат, возвращаясь к контексту jQuery ajax, а НЕ к контексту отправки формы.

1 голос
/ 30 апреля 2009

В этом случае вам необходимо выполнить синхронный HTTP-запрос, т. Е. Вы должны установить для асинхронной опции значение false.
В вашей версии httpxmlrequest является асинхронным. Это может быть завершено задолго до того, как ваш обработчик onsubmit вернулся и обратный вызов onsuccess вызывается вне контекста обработчика onsubmit.
«Return false» будет возвращаемым значением анонимной функции функции (result) {...}, а не возвращаемым значением обработчика onsubmit.

...