2013-09-12 6 views
2

У меня есть форма, которую я отправляю через jquery ajax. Я пытаюсь достичь: Перед отправкой формы должно быть отправлено уведомление, и после того, как запрос будет выполнен, это сообщение должно исчезнуть и должно появиться сообщение «отправлено». Я использую pnotify. То, что я пытался до сих пор:ajax form отправить уведомление jquery

inProcess = function(){ 
      m = $.pnotify({ 
       title: "sending" 
      }); 
      return true; 
     } 

     event.preventDefault(); 
     $.ajax('',{ 
      method: "POST", 
      data: myform.serialize, 

      beforeSend: inProcess, 

      complete: function(response){ 
       $.pnotify({ 
        title: "Sent", 
        type: "success", 
        opacity: "0.8", 
        delay: 5000 
       }); 
       m.remove(); 
      } 
     }); 

Это один не работает:

  1. По какой-то причине «послал» появляется перед отправкой. Зачем?
  2. Функция remove() удаляет уведомление до его создания, но оно не полностью удаляется, видно, что уведомление «отправка» сдвинуто вниз. Как я могу полностью удалить уведомление?
  3. Нужно ли мне обернуть вызов «отправки» внутри функции, только потому, что beforeSend требует true в качестве кода возврата? Или есть более элегантный способ? Особенно мне не нравится глобальный m переменная

Edit:

Согласно некоторым комментариям и ИНГ некоторых Google», я изменил мой код:

inProcess = function(){ 
      m = $.pnotify({ 
       title: "sending" 
      }); 
      return true; 
     } 

     event.preventDefault(); 
     $.ajax('',{ 
      method: "POST", 
      data: myform.serialize, 

      beforeSend: inProcess, 

      complete: setTimeout(function(response){ 
       $.pnotify({ 
        title: "Sent", 
        type: "success", 
        opacity: "0.8", 
        delay: 5000 
       }); 
       $.pnotify_remove_all(),1000) 
      } 
     }); 

Который, кажется, работает но на самом деле не удовлетворительно из-за вопросов выше

+0

попробовать _setTimeout() _ – tonoslfx

+0

Спасибо. Я предполагаю, что вы имеете в виду 'complete: setTimeout (function (response) {...}'. Я бы этого не сделал, потому что в этом случае полная функция всегда вызывается с задержкой, независимо от того, был ли запрос быстрым или Нет. Я думаю, что это довольно хакерское решение. – ProfHase85

ответ

0

следующий способ проще 4 меня. может помочь:

inProcess(); 

$.post(
'file.php', 
{ 
    data: myform.serialize 
}, 
function(response) 
{ 
    success(response); 
    $.pnotify({ 
    title: "Sent", 
    type: "success", 
    opacity: "0.8", 
    delay: 5000 
    }); 
},'json' 
) 
.always(function() { m.remove(); } 
); 
+0

В этом случае inProcess вызывается еще до отправки формы ... Я просто хочу, чтобы он появлялся на отправляющем событии – ProfHase85

+0

, вы могли бы включить следующие строки: .ajaxStart (function () { InProcess();} ); .ajaxStop (функция() { m.remove();} ); .ajaxError (функция() { предупреждение ('ошибка'); }); –