Как показать загрузку spinner в jQuery?
на прототип Я могу показать "загрузка..."изображение с этим кодом:
var myAjax = new Ajax.Request( url, {method: 'get', parameters: pars,
onLoading: showLoad, onComplete: showResponse} );
function showLoad () {
...
}
на jQuery, Я могу загрузить страницу сервера в элемент с этим:
$('#message').load('index.php?pg=ajaxFlashcard');
но как я могу прикрепить загрузочный счетчик к этой команде, как это было в прототипе?
24 ответа:
есть несколько способов. Мой предпочтительный способ-прикрепить функцию к событиям ajaxStart/Stop на самом элементе.
$('#loadingDiv') .hide() // Hide it initially .ajaxStart(function() { $(this).show(); }) .ajaxStop(function() { $(this).hide(); }) ;
функции ajaxStart/Stop будут срабатывать всякий раз, когда вы выполняете какие-либо вызовы Ajax.
обновление: начиная с jQuery 1.8, в документации указано, что
.ajaxStart/Stop
должны быть прикреплены только кdocument
. Это преобразует приведенный выше фрагмент кода в:var $loading = $('#loadingDiv').hide(); $(document) .ajaxStart(function () { $loading.show(); }) .ajaxStop(function () { $loading.hide(); });
для jQuery я использую
jQuery.ajaxSetup({ beforeSend: function() { $('#loader').show(); }, complete: function(){ $('#loader').hide(); }, success: function() {} });
вы можете просто использовать jQuery
.ajax
функция и использовать ее опциюbeforeSend
и определить некоторую функцию, в которой вы можете показать что-то вроде загрузчика div и на опции успеха вы можете скрыть этот загрузчик div.jQuery.ajax({ type: "POST", url: 'YOU_URL_TO_WHICH_DATA_SEND', data:'YOUR_DATA_TO_SEND', beforeSend: function() { $("#loaderDiv").show(); }, success: function(data) { $("#loaderDiv").hide(); } });
вы можете иметь любое вращающееся изображение Gif. Вот сайт, который является отличным генератором загрузчика AJAX в соответствии с вашей цветовой схемой:http://ajaxload.info/
вы можете вставить анимированное изображение в DOM прямо перед вызовом AJAX и выполнить встроенную функцию для его удаления...
$("#myDiv").html('<img src="images/spinner.gif" alt="Wait" />'); $('#message').load('index.php?pg=ajaxFlashcard', null, function() { $("#myDiv").html(''); });
Это позволит убедиться, что ваша анимация начинается в том же кадре на последующих запросах (если это имеет значение). Обратите внимание, что старые версии IE может есть трудности с анимацией.
удачи!
$('#message').load('index.php?pg=ajaxFlashcard', null, showResponse); showLoad(); function showResponse() { hideLoad(); ... }
Если вы используете
$.ajax()
вы можете использовать что-то вроде этого:$.ajax({ url: "destination url", success: sdialog, error: edialog, // shows the loader element before sending. beforeSend: function () { $("#imgSpinner1").show(); }, // hides the loader after completion of request, whether successfull or failor. complete: function () { $("#imgSpinner1").hide(); }, type: 'POST', dataType: 'json' });
используйте плагин загрузки:http://plugins.jquery.com/project/loading
$.loading.onAjax({img:'loading.gif'});
вариант: у меня есть значок с id="logo" в левом верхнем углу главной страницы; spinner gif затем накладывается сверху (с прозрачностью), когда ajax работает.
jQuery.ajaxSetup({ beforeSend: function() { $('#logo').css('background', 'url(images/ajax-loader.gif) no-repeat') }, complete: function(){ $('#logo').css('background', 'none') }, success: function() {} });
Я закончил с двумя изменениями в оригинальный ответ.
- начиная с jQuery 1.8, ajaxStart и ajaxStop должны быть прикреплены только к
document
. Это затрудняет фильтрацию только некоторых запросов ajax. Су...- переключение на ajaxSend и ajaxComplete позволяет просматривать текущий запрос ajax перед показом счетчика.
это код после этих изменения:
$(document) .hide() // hide it initially .ajaxSend(function(event, jqxhr, settings) { if (settings.url !== "ajax/request.php") return; $(".spinner").show(); }) .ajaxComplete(function(event, jqxhr, settings) { if (settings.url !== "ajax/request.php") return; $(".spinner").hide(); })
Я тоже хочу внести свой вклад в этот ответ. Я искал что-то подобное в jQuery, и это то, что я в конечном итоге использовал.
Я получил свой загрузочный счетчик от http://ajaxload.info/. мое решение основано на этом простом ответе на http://christierney.com/2011/03/23/global-ajax-loading-spinners/.
в основном ваша разметка HTML и CSS будет выглядеть так:
<style> #ajaxSpinnerImage { display: none; } </style> <div id="ajaxSpinnerContainer"> <img src="~/Content/ajax-loader.gif" id="ajaxSpinnerImage" title="working..." /> </div>
и тогда Вы код для jQuery будет выглядеть что-то вроде этого:
<script> $(document).ready(function () { $(document) .ajaxStart(function () { $("#ajaxSpinnerImage").show(); }) .ajaxStop(function () { $("#ajaxSpinnerImage").hide(); }); var owmAPI = "http://api.openweathermap.org/data/2.5/weather?q=London,uk&APPID=YourAppID"; $.getJSON(owmAPI) .done(function (data) { alert(data.coord.lon); }) .fail(function () { alert('error'); }); }); </script>
это так просто :)
вы можете просто назначить изображение загрузчика тому же тегу, на который вы позже загрузите контент, используя вызов Ajax:
$("#message").html('<span>Loading...</span>'); $('#message').load('index.php?pg=ajaxFlashcard');
вы также можете заменить тег span на тег image.
а также установка глобальных значений по умолчанию для событий ajax, вы можете установить поведение для конкретных элементов. Может быть, достаточно просто сменить класс?
$('#myForm').ajaxSend( function() { $(this).addClass('loading'); }); $('#myForm').ajaxComplete( function(){ $(this).removeClass('loading'); });
пример CSS, чтобы скрыть #myForm с помощью spinner:
.loading { display: block; background: url(spinner.gif) no-repeat center middle; width: 124px; height: 124px; margin: 0 auto; } /* Hide all the children of the 'loading' element */ .loading * { display: none; }
$('#loading-image').html('<img src="/images/ajax-loader.gif"> Sending...'); $.ajax({ url: uri, cache: false, success: function(){ $('#loading-image').html(''); }, error: function(jqXHR, textStatus, errorThrown) { var text = "Error has occured when submitting the job: "+jqXHR.status+ " Contact IT dept"; $('#loading-image').html('<span style="color:red">'+text +' </span>'); } });
я использовал следующий диалог на jQuery пользовательского интерфейса. (Может быть, он работает с другими обратными вызовами ajax?)
$('<div><img src="/i/loading.gif" id="loading" /></div>').load('/ajax.html').dialog({ height: 300, width: 600, title: 'Wait for it...' });
содержит анимированный загрузочный gif до тех пор, пока его содержимое не будет заменено после завершения вызова ajax.
JavaScript
$.listen('click', '#captcha', function() { $('#captcha-block').html('<div id="loading" style="width: 70px; height: 40px; display: inline-block;" />'); $.get("/captcha/new", null, function(data) { $('#captcha-block').html(data); }); return false; });
CSS
#loading { background: url(/image/loading.gif) no-repeat center; }
обратите внимание, что вы должны использовать асинхронные вызовы для работы блесен (по крайней мере, это то, что заставило меня не показывать до тех пор, пока вызов ajax, а затем быстро ушел, поскольку вызов закончился и удалил блесну).
$.ajax({ url: requestUrl, data: data, dataType: 'JSON', processData: false, type: requestMethod, async: true, <<<<<<------ set async to true accepts: 'application/json', contentType: 'application/json', success: function (restResponse) { // something here }, error: function (restResponse) { // something here } });
Это очень простой и умный плагин для этой конкретной цели: https://github.com/hekigan/is-loading
Я делаю так:
var preloaderdiv = '<div class="thumbs_preloader">Loading...</div>'; $('#detail_thumbnails').html(preloaderdiv); $.ajax({ async:true, url:'./Ajaxification/getRandomUser?top='+ $(sender).css('top') +'&lef='+ $(sender).css('left'), success:function(data){ $('#detail_thumbnails').html(data); } });
Я думаю, что вы правы. Этот метод слишком глобален...
однако-это хорошее значение по умолчанию, когда ваш вызов AJAX не влияет на саму страницу. (например, сохранение фона). ( вы всегда можете отключить его для определенного вызова ajax, передав "global": false-см. документацию по адресу jquery
когда вызов AJAX предназначен для обновления части страницы, мне нравится, что мои "загрузочные" изображения относятся к обновленному разделу. Я хотел бы посмотреть, какие часть обновляется.
представьте, как здорово было бы, если бы вы могли просто написать что-то вроде :
$("#component_to_refresh").ajax( { ... } );
и это покажет "загрузку" в этом разделе. Ниже приведена функция, которую я написал, которая также обрабатывает дисплей "загрузка", но она специфична для области, которую вы обновляете в ajax.
во-первых, позвольте мне показать вам, как использовать его
<!-- assume you have this HTML and you would like to refresh it / load the content with ajax --> <span id="email" name="name" class="ajax-loading"> </span> <!-- then you have the following javascript --> $(document).ready(function(){ $("#email").ajax({'url':"/my/url", load:true, global:false}); })
и это функция-основной старт, который вы можете улучшить, как вы хотите. он очень гибкий.
jQuery.fn.ajax = function(options) { var $this = $(this); debugger; function invokeFunc(func, arguments) { if ( typeof(func) == "function") { func( arguments ) ; } } function _think( obj, think ) { if ( think ) { obj.html('<div class="loading" style="background: url(/public/images/loading_1.gif) no-repeat; display:inline-block; width:70px; height:30px; padding-left:25px;"> Loading ... </div>'); } else { obj.find(".loading").hide(); } } function makeMeThink( think ) { if ( $this.is(".ajax-loading") ) { _think($this,think); } else { _think($this, think); } } options = $.extend({}, options); // make options not null - ridiculous, but still. // read more about ajax events var newoptions = $.extend({ beforeSend: function() { invokeFunc(options.beforeSend, null); makeMeThink(true); }, complete: function() { invokeFunc(options.complete); makeMeThink(false); }, success:function(result) { invokeFunc(options.success); if ( options.load ) { $this.html(result); } } }, options); $.ajax(newoptions); };
Если вы не хотите писать свой собственный код, есть также много плагинов, которые делают только то, что:
Если вы планируете использовать загрузчик каждый раз, когда вы делаете запрос на сервер, вы можете использовать следующий шаблон.
jTarget.ajaxloader(); // (re)start the loader $.post('/libs/jajaxloader/demo/service/service.php', function (content) { jTarget.append(content); // or do something with the content }) .always(function () { jTarget.ajaxloader("stop"); });
этот код, в частности, использует плагин jajaxloader (который я только что создал)
вы всегда можете использовать блок UI jQuery плагин который делает все для вас, и он даже блокирует страницу любого ввода во время загрузки ajax. В случае, если плагин не работает, вы можете прочитать о том, что надо использовать в этом ответе. проверить.
мой код ajax выглядит так, по сути, я только что прокомментировал async: false line и spinner появляется.
$.ajax({ url: "@Url.Action("MyJsonAction", "Home")", type: "POST", dataType: "json", data: {parameter:variable}, //async: false, error: function () { }, success: function (data) { if (Object.keys(data).length > 0) { //use data } $('#ajaxspinner').hide(); } });
Я показываю счетчик в функции перед кодом ajax:
$("#MyDropDownID").change(function () { $('#ajaxspinner').show();
для Html, я использовал шрифт удивительный класс:
<i id="ajaxspinner" class="fas fa-spinner fa-spin fa-3x fa-fw" style="display:none"></i>
надеюсь, что это поможет кому-то.