Как я могу создать & ldquo; Пожалуйста, подождите, загрузка & hellip; & rdquo; анимация с использованием jQuery?

555
задан Shog9 25 October 2015 в 16:43
поделиться

6 ответов

Вы можете делать это различными способами. Это может быть тонкий, как маленькое состояние на странице, говорящее "Загрузка...", или громкий, как целый элемент, серый цвет страницы во время загрузки новых данных. Подход, который я рассмотрю ниже, покажет вам, как выполнить оба метода.

The Setup

Давайте начнем с получения приятной анимации "загрузки" с http://ajaxload.info. Я буду использовать enter image description here

Давайте создадим элемент, который мы можем показать/скрыть в любой момент, когда делаем ajax запрос:

<div class="modal"><!-- Place at bottom of page --></div>

The CSS

Далее дадим ему немного чутья:

/* Start by setting display:none to make this hidden.
   Then we position it in relation to the viewport window
   with position:fixed. Width, height, top and left speak
   for themselves. Background we set to 80% white with
   our animation centered, and no-repeating */
.modal {
    display:    none;
    position:   fixed;
    z-index:    1000;
    top:        0;
    left:       0;
    height:     100%;
    width:      100%;
    background: rgba( 255, 255, 255, .8 ) 
                url('http://i.stack.imgur.com/FhHRx.gif') 
                50% 50% 
                no-repeat;
}

/* When the body has the loading class, we turn
   the scrollbar off with overflow:hidden */
body.loading .modal {
    overflow: hidden;   
}

/* Anytime the body has the loading class, our
   modal element will be visible */
body.loading .modal {
    display: block;
}

И, наконец, jQuery

Хорошо, перейдем к jQuery. Следующая часть на самом деле очень проста:

$body = $("body");

$(document).on({
    ajaxStart: function() { $body.addClass("loading");    },
     ajaxStop: function() { $body.removeClass("loading"); }    
});

Вот так! Мы присоединяем некоторые события к элементу тела в любое время при запуске событий ajaxStart или ajaxStop. Когда начинается событие ajax, мы добавляем класс "load" в тело, а когда события завершаются, мы удаляем класс "load" из тела.

See it in action: http://jsfiddle.net/VpDUG/4952/

1183
ответ дан 22 November 2019 в 22:11
поделиться

Что касается фактической загрузки изображения, посетите этот сайт для получения множества вариантов.

Что касается отображения DIV с этим изображением в начале запроса, у вас есть несколько вариантов:

A) Вручную показать и скрыть изображение:

$('#form').submit(function() {
    $('#wait').show();
    $.post('/whatever.php', function() {
        $('#wait').hide();
    });
    return false;
});

B) Использовать ajaxStart и ajaxComplete :

$('#wait').ajaxStart(function() {
    $(this).show();
}).ajaxComplete(function() {
    $(this).hide();
});

При использовании этого элемента будет отображаться / скрываться для любой запрос . Может быть хорошим или плохим, в зависимости от необходимости.

C) Использовать отдельные обратные вызовы для конкретного запроса:

$('#form').submit(function() {
    $.ajax({
        url: '/whatever.php',
        beforeSend: function() { $('#wait').show(); },
        complete: function() { $('#wait').hide(); }
    });
    return false;
});
209
ответ дан 22 November 2019 в 22:11
поделиться

Это заставит кнопки исчезнуть, тогда на их месте появится анимация «загрузки» и, наконец, просто отобразит сообщение об успехе.

$(function(){
    $('#submit').click(function(){
        $('#submit').hide();
        $("#form .buttons").append('<img src="assets/img/loading.gif" alt="Loading..." id="loading" />');
        $.post("sendmail.php",
                {emailFrom: nameVal, subject: subjectVal, message: messageVal},
                function(data){
                    jQuery("#form").slideUp("normal", function() {                 
                        $("#form").before('<h1>Success</h1><p>Your email was sent.</p>');
                    });
                }
        );
    });
});
3
ответ дан 22 November 2019 в 22:11
поделиться

Вы можете взять анимированный GIF вращающегося круга из Ajaxload - вставьте это где-нибудь в герархию файла вашего сайта. Затем вам просто нужно добавить HTML элемент с правильным кодом и удалить его, когда вы закончите. Это довольно просто:

function showLoadingImage() {
    $('#yourParentElement').append('<div id="loading-image"><img src="path/to/loading.gif" alt="Loading..." /></div>');
}

function hideLoadingImage() {
    $('#loading-image').remove();
}

Тогда вам просто нужно использовать эти методы в вашем AJAX вызове:

$.load(
     'http://example.com/myurl',
     { 'random': 'data': 1: 2, 'dwarfs': 7},
     function (responseText, textStatus, XMLHttpRequest) {
         hideLoadingImage();
     }
);

// this will be run immediately after the AJAX call has been made,
// not when it completes.
showLoadingImage();

Это имеет несколько предостережений: во-первых, если у вас есть два или более места, где может быть показана загрузочная картинка, вам нужно будет как-то отследить, сколько вызовов выполняется одновременно, и только потом скрыть, когда все они будут завершены. Это можно сделать с помощью простого счетчика, который должен работать практически во всех случаях.

Во-вторых, это будет только скрывать загрузочное изображение при успешном вызове AJAX. Для обработки состояний ошибок нужно посмотреть $.ajax, что сложнее, чем $.load, $.get и т.п., но и гораздо гибче.

.
18
ответ дан 22 November 2019 в 22:11
поделиться

Наряду с тем, что предложили Джонатан и Самир (оба отличных ответа btw!), у jQuery есть несколько встроенных событий, которые он будет увольнять за вас, когда сделает запрос на аякс.

Есть ajaxStart event

Show a load message whenever anJAX request starts (and none is already active).

...и это брат, событие ajaxStop event

Attach a function to be executed whenever all AJAX requests has ended. Это событие Ajax.

вместе, они делают прекрасный способ показать сообщение о прогрессе, когда какая-либо активность ajax происходит где-либо на странице.

HTML:

<div id="loading">
  <p><img src="loading.gif" /> Please Wait</p>
</div>

Script:

$(document).ajaxStart(function(){
    $('#loading').show();
 }).ajaxStop(function(){
    $('#loading').hide();
 });
110
ответ дан 22 November 2019 в 22:11
поделиться

jQuery предоставляет крючки для событий, когда AJAX запрашивает старт и финиш. Вы можете подключиться к ним, чтобы показать загрузчик.

Например, создайте следующий div:

<div id="spinner">
  <img src="images/spinner.gif" alt="Loading" />
</div>

Установите его на отображение: none в ваших таблицах стилей. Вы можете стилизовать его любым удобным для вас способом. Вы можете сгенерировать красивую загрузочную картинку на Ajaxload.info, если хотите.

Затем, вы можете использовать нечто подобное, чтобы она автоматически отображалась при отправке Ajax-запросов:

$(document).ready(function () {

    $('#spinner').bind("ajaxSend", function() {
        $(this).show();
    }).bind("ajaxComplete", function() {
        $(this).hide();
    });

});

Просто добавьте этот Javascript-блок в конец вашей страницы перед закрытием тэга тела или где угодно.

Теперь, всякий раз, когда вы посылаете Ajax-запросы, будет показываться div #spinner. Когда запрос будет завершен, он снова будет скрыт.

6
ответ дан 22 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: