В простом javascript все очень просто: нужно просто прикрепить обратный вызов к {XMLHTTPRequest}.onprogress
var xhr = new XMLHttpRequest();
xhr.onprogress = function(e){
if (e.lengthComputable)
var percent = (e.loaded / e.total) * 100;
};
xhr.open('GET', 'http://www...', true);
xhr.onreadystatechange = function() {
...
};
xhr.send(null);
но я делаю сайт ajax, который загружает данные html с помощью JQuery ( $.get()
или $.ajax()
), и мне было интересно, какой лучший способ получить ход выполнения запроса, чтобы отобразить его с небольшой полосой выполнения, но, что любопытно, я не найти что-нибудь полезное в документации JQuery ...
jqXHR
объект (обертка объекта XHR возвращенного$.ajax()
) и нашелprogress
атрибут в ней (наряду сabort
,complete
,success
и т.д.), но в документах JQuery это отсутствует: api.jquery.com/jQuery.ajax/#jqXHRОтветы:
Что-то вроде этого для
$.ajax
(только HTML5):источник
В jQuery уже реализованы обещания, поэтому лучше использовать эту технологию и не переносить логику событий в
options
параметр. Я сделал плагин jQuery, который добавляет обещание прогресса, и теперь его легко использовать, как и другие обещания:Проверьте это на github
источник
TypeError: $.ajax(...).progress(...).progressUpload is not a function
.... В чем проблема?Я пробовал три разных способа перехвата конструкции объекта Ajax:
xhrFields
, но она позволяет использовать только одного слушателя, присоединяется только к прогрессу загрузки (не выгрузки) и требует того, что кажется ненужным копированием и вставкой.progress
функцию к возвращенному обещанию, но мне пришлось поддерживать свой собственный массив обработчиков. Мне не удалось найти хороший объект для прикрепления обработчиков, потому что в одном месте я имел бы доступ к XHR, а в другом - к jQuery XHR, но у меня никогда не было доступа к отложенному объекту (только его обещанию).ajax
своим собственным. Единственный потенциальный недостаток - вы больше не можете использовать свои собственныеxhr()
настройки. Вы можете учесть это, проверив,options.xhr
является ли это функцией.Я на самом деле вызываю свою
promise.progress
функцию,xhrProgress
чтобы потом легко ее найти. Вы можете назвать это как-нибудь иначе, чтобы разделить слушателей загрузки и скачивания. Надеюсь, это кому-то поможет, даже если исходный плакат уже получил то, что ему нужно.источник
$.ajax({ ... }).progress(function(evl) { console.log(evl); });
но ничего не происходит. Вы можете помочь мне? :)jQuery имеет
AjaxSetup()
функцию, которая позволяет вам регистрировать глобальные обработчики ajax, такие какbeforeSend
иcomplete
для всех вызовов ajax, а также позволяет вам получить доступ кxhr
объекту, чтобы выполнить прогресс, который вы ищетеисточник
.ajaxStart()
,.ajaxStop()
,.ajaxComplete()
,.ajaxError()
,.ajaxSuccess()
,.ajaxSend()
-rather чем в вариантах объекта для$.ajaxSetup()
. ' < api.jquery.com/jQuery.ajaxSetup/#entry-longdesc >http://www.htmlgoodies.com/beyond/php/show-progress-report-for-long-running-php-scripts.html
Я искал подобное решение и нашел его полноценным.
}
и ваш сервер выводит
источник
Выполните следующие действия, чтобы отобразить ход выполнения запроса Ajax:
Чтобы упростить задачу, я рекомендую вам использовать классы JS для динамического отображения и скрытия счетчика для этой цели.
Надеюсь, это поможет!
источник