Как показать обработку анимации / спиннера во время ajax-запроса? - PullRequest
18 голосов
/ 04 февраля 2011

Мне нужна базовая анимация вращения или обработки, пока обрабатывается мой AJAX POST.Я использую JQuery и Python.Я посмотрел документацию, но не могу точно определить, куда поместить функции ajaxStart и ajaxStop.

Вот мой js:

    <script type="text/javascript">
      $(function() {  
        $('.error').hide();  
        $("#checkin-button").click(function() { 
          var mid = $("input#mid").val();
          var message = $("textarea#message").val();
          var facebook = $('input#facebook').is(':checked');
          var name = $("input#name").val();
          var bgg_id = $("input#bgg-id").val();
          var thumbnail = $("input#thumbnail").val();
          var dataString = 'mid='+mid+'&message='+message+'&facebook='+facebook+'&name='+name+'&bgg_id='+bgg_id+'&thumbnail='+thumbnail;  
          $.ajax({  
            type: "POST",  
            url: "/game-checkin",  
            data: dataString,  
            success: function(badges) {  
            $('#checkin-form').html("<div id='message'></div><div id='badges'></div>");  
            $('#message').html("<h2><img class=\"check-mark\" src=\"/static/images/check-mark.png\"/>You are checked in!</h2>");  
            $.each(badges, function(i,badge) {
              $('#badges').append("<h2>New Badge!</h2><p><img class='badge' src='"+badge.image_url+"'><span class='badge-title'>"+badge.name+"</span></p>");  
            });
          }
       });
       return false;
     });  
    });
  </script>

Ответы [ 7 ]

25 голосов
/ 04 февраля 2011
$.ajax({
  type: "POST",
  url: "/game-checkin",
  data: dataString,
  beforeSend: function () {
    // ... your initialization code here (so show loader) ...
  },
  complete: function () {
    // ... your finalization code here (hide loader) ...
  },
  success: function (badges) {
    $('#checkin-form').html("<div id='message'></div><div id='badges'></div>");
    $('#message').html("<h2><img class=\"check-mark\" src=\"/static/images/check-mark.png\"/>You are checked in!</h2>");
    $.each(badges, function (i, badge) {
      $('#badges').append("<h2>New Badge!</h2><p><img class='badge' src='" + badge.image_url + "'><span class='badge-title'>" + badge.name + "</span></p>");
    })
  }
});

http://api.jquery.com/jQuery.ajax/:

Вот перехватчики обратного вызова, предоставляемые $ .ajax ():

beforeSend callback вызывается; он получает объект jqXHR и карту настроек в качестве параметров. обратные вызовы ошибок вызываются в том порядке, в котором они зарегистрированы, если запрос не выполняется. Они получают jqXHR, строку, указывающую тип ошибки, и объект исключения, если это применимо. Некоторые встроенные ошибки предоставляют строку в качестве объекта исключения: «abort», «timeout», «No Transport». Обратный вызов dataFilter вызывается сразу после успешного получения данных ответа. Он получает возвращенные данные и значение dataType и должен возвращать (возможно, измененные) данные, чтобы перейти к успеху. После этого успешные обратные вызовы вызываются в том порядке, в котором они зарегистрированы. Они получают возвращенные данные, строку, содержащую код успеха, и объект jqXHR. полные обратные вызовы запускаются в порядке их регистрации, когда запрос завершается, в случае неудачи или успеха. Они получают объект jqXHR, а также строку, содержащую код успеха или ошибки.

Обратите внимание на beforeSend и полные дополнения метода к коду.

Надеюсь, это поможет.

6 голосов
/ 05 февраля 2011

Если вы используете jQuery 1.5, вы можете сделать это красиво, ненавязчиво и в целом с помощью префильтра . Давайте сделаем очень простой плагин для этого:

(function($) {

    var animations = {};

    $.ajaxPrefilter(function( options, _, jqXHR ) {
        var animation = options.animation && animations[ options.animation ];
        if ( animation ) {
            animation.start();
            jqXHR.then( animation.stop, animation.stop );
        }
    });

    $.ajaxAnimation = function( name, object ) {
        if ( object ) {
            loadingAnimations[ name ] = object;
        }
        return loadingAnimations[ name ];
    };

})( jQuery );

Вы устанавливаете анимацию следующим образом:

jQuery.ajaxAnimation( "spinner" , {
    start: function() {
        // code that starts the animation
    }
    stop: function() {
        // code that stops the animation
    }
} );

затем вы указываете анимацию в опциях ajax:

jQuery.ajax({
    type: "POST",
    url: "/game-checkin",
    data: dataString,
    animation: "spinner",
    success: function() {
        // your success code here
    }
});

и префильтр обеспечит запуск и остановку анимации "spinner".

Конечно, таким образом, вы можете установить альтернативную анимацию и выбрать ту, которая вам нужна для каждого запроса. Вы даже можете установить анимацию по умолчанию для всех запросов, используя ajaxSetup:

jQuery.ajaxSetup({
    animation: "spinner"
});
3 голосов
/ 04 февраля 2011

Лучший метод, который я нашел, при условии, что вы заполняете настоящее, но пустое поле, - это наличие класса .loading, определенного с background-image: url('images/loading.gif') в вашем CSS. Затем вы можете добавлять и удалять класс загрузки при необходимости с помощью jQuery.

2 голосов
/ 27 мая 2014

вы можете установить глобальный обработчик значка загрузки ajax, используя здесь #ajxLoader забирает ваш значок загрузки

   $( document ).ajaxStart(function() {
        $("#ajxLoader").fadeIn();
    });

    $( document ).ajaxComplete(function() {
        $("#ajxLoader").fadeOut();
    });
2 голосов
/ 04 февраля 2011

Я написал сообщение в блоге о том, как сделать это на уровне общего документа.

// prepare the form when the DOM is ready 
$(document).ready(function() { 

  // Setup the ajax indicator
  $('body').append('<div id="ajaxBusy"><p><img src="images/loading.gif"></p></div>');

  $('#ajaxBusy').css({
    display:"none",
    margin:"0px",
    paddingLeft:"0px",
    paddingRight:"0px",
    paddingTop:"0px",
    paddingBottom:"0px",
    position:"absolute",
    right:"3px",
    top:"3px",
     width:"auto"
  });
});

// Ajax activity indicator bound to ajax start/stop document events
$(document).ajaxStart(function(){ 
  $('#ajaxBusy').show(); 
}).ajaxStop(function(){ 
  $('#ajaxBusy').hide();
});
2 голосов
/ 04 февраля 2011
$(function() {
        $('.error').hide();
        $("#checkin-button").click(function() {
                var mid = $("input#mid").val();
                var message = $("textarea#message").val();
                var facebook = $('input#facebook').is(':checked');
                var name = $("input#name").val();
                var bgg_id = $("input#bgg-id").val();
                var thumbnail = $("input#thumbnail").val();
                var dataString = 'mid=' + mid + '&message=' + message + '&facebook=' + facebook + '&name=' + name + '&bgg_id=' + bgg_id + '&thumbnail=' + thumbnail;
                $.ajax({
                        type : "POST",
                        url : "/game-checkin",
                        data : dataString,
                        beforeSend : function() {
                         $('#preloader').addClass('active');
                        },
                        success : function(badges) {
                            $('#preloader').removeClass('active');
                            $('#checkin-form').html("<div id='message'></div><div id='badges'></div>");
                            $('#message').html("<h2><img class=\"check-mark\" src=\"/static/images/check-mark.png\"/>You are checked in!</h2>");
                            $.each(badges, function(i, badge) {
                                    $('#badges').append("<h2>New Badge!</h2><p><img class='badge' src='" + badge.image_url + "'><span class='badge-title'>" + badge.name + "</span></p>");
                                });
                        },
                        complete : function() {
                            $('#preloader').removeClass('active');                      
                        }
                    });
                return false;
            });
    });

#preloader{
 background: url(staticpreloader.gif);
}
.active {
 background: url(activepreloader.gif);
}
2 голосов
/ 04 февраля 2011

Процесс AJAX запускается при запуске метода $.ajax() и останавливается при запуске «полного» обратного вызова. Итак, начните обработку изображений / уведомлений прямо перед строкой $.ajax() и завершите ее завершенным обратным вызовом.

Обработчики

ajaxStart и ajaxStop могут быть добавлены к любым элементам и будут вызываться всякий раз, когда ajax-запросы запускают или останавливают (если есть одновременные экземпляры, start вызывается только для первого, остановка - для последнего, чтобы идти ). Так что это просто другой способ создания глобальных уведомлений, если у вас есть, например, счетчик статуса где-то на странице, который представляет любую активность.

...