JQuery отправить функцию события возвращаемое значение - PullRequest
2 голосов
/ 28 октября 2011

У меня есть функция, подключенная к событию $('form').submit().

Эта функция запускает запрос ajax и обновляет документ.

Я хочу сделать так, чтобы в случае возникновения ошибки ajax форма продолжала отправляться в обычном режиме. Это возможно?

Я пытался return fail_status; в конце функции (fail_status - логическая переменная, которая обновляется до "true" в функции "error" в ajax), но, похоже, она не работает ...

Код выглядит примерно так:

$('form').submit(function(){
  var fail_status = false;

  $.ajax(

   ...

   error: function(){
     fail_status = true;
   }

   ...

  );

  return fail_status;
  // so if it's true the form should be submitted normally...
});

Ответы [ 4 ]

1 голос
/ 28 октября 2011

Вы должны либо использовать синхронный запрос AJAX (НЕ рекомендуется!), Либо использовать приведенный ниже код.

Концепция, лежащая в основе:

  • Если fail_status == false, продолжитьс функцией (по умолчанию)
  • Используйте ev.preventDefault() для отмены отправки формы.Задайте ajax_request_made = true
  • Инициировать вызов AJAX
    1. В случае успеха: Установите ajax_request_made = false, чтобы включить отправку новых форм
    2. При ошибке: Установите ajax_request_made = false, чтобы включить новую формуДоводы,и установите fail_status = true.Вызовите функцию отправки еще раз.Поскольку для этой переменной задано значение true, оператор ev.preventDefault() никогда не достигается и форма отправляется.

var ajax_request_made = false,
    fail_status = false;
$('form').submit(function(ev){
  var the_form = this;
  if(fail_status){
      fail_status = false;
      return; //No prevent default, so the form is submitted.
  }

  ev.preventDefault(); // Cancel form submission
  if(ajax_request_made) { //Only allow one AJAX call at the form at a time
      return;       //Don't run the function when the request hasn't finished yet
  }

  ajax_request_made = true;
  $.ajax( ...
   complete: function(){
      ajax_request_made = false;  //Se
   },
   error: function(){
      ajax_request_made = false;
      fail_status = true;         // Set flag so that the form submits (see top)
      the_form.submit();          // Request form submission.
   } ...
  );
});
1 голос
/ 28 октября 2011

Вы можете разделить события:

$('#formSubmitButton').click(function(e){
    e.preventDefault();
    $.ajax({
        // do ajax stuff here
        complete: function(){
            $('#myform').submit();
        }
    });

});

complete несмещен к успешному или неудачному ответу ajax, пока существует ответ от сервера. Если вы только хотите отправить форму с ошибкой ajax, вы должны поместить событие submit в метод error.

1 голос
/ 28 октября 2011

Проблема в том, что JQuery по умолчанию установлен на Asynchronous. Это означает, что он возвращает «fail_status» до того, как получит ответ сервера.

Лучше всего было бы иметь error: функцию, которая отправляет форму программно.

error: function(){$('#myform').submit();}

РЕДАКТИРОВАТЬ: Попробуйте переписать свою функцию:

$('form').submit(function(retry){
    if(!retry){
        //do ajax
        error:function(){
              $('form').submit(true);
        }
    }
    return retry;
})
1 голос
/ 28 октября 2011

Проблема в том, что AJAX является асинхронным. Следовательно, функция submit завершается до того, как вызов ajax завершится неудачно. Итак, вы возвращаете ложь.

Вы не сможете сделать это так, как у вас, если не сделаете вызов AJAX синхронным. Обычно это плохая идея, поскольку браузер зависает при отправке запроса.

Единственный другой вариант, который я вижу, - это отправить форму из функции ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...