#jquery #ajax
Задача - при jquery.ajax-запросе выводить результат в div не тогда, когда он полностью получен браузером, а по мере его загрузки. Нужно, если данные достаточно объёмные. Событие success или complete не подходят, т.к. срабатывают уже после полной загрузки данных. Собственно, вопрос в том, есть ли вариант реализации? Деление данных на сервере на части и пулинг - не рассматриваются. Благодаря ответам (всем спасибо!) разобрался. Решение есть, основано на использовании объекта jqXHR. Детали - по ссылке http://incode.pro/jquery/ajax-na-praktike-progress-bar-indikator-protsessa-zagruzki.html. Прогресс-бар меня не интересовал, т.к. было невозможно рассчитать % загрузки, а вот вывод данных возможен, если использовать свойство target.response объекта, возвращаемого установленным обработчиком подгрузки. По ходу загрузки нужно лишь выводить в нужный DOM-элемент тело ответа, которое имеется в target.response, причём целиком, не частями!. Типа так: $('#ResultBox').html(evt.target.response)
Ответы
В JS пишем код $.ajax запроса и добавляем к параметрам xhr, в callback-функции которого, мы можем работать с объектом XMLHttpRequest, изменяя или дополняя его поведение, получать доступ его свойствам и методам, устанавливать свои обработчики событий и т.д.: $(function(){ var progressBar = $('#progressbar'); $('#my_form').on('submit', function(e){ e.preventDefault(); var $this = $(this), formData = new FormData($this.get(0)); $.ajax({ url: $this.attr('action'), type: $this.attr('method'), contentType: false, processData: false, data: formData, dataType: 'json', xhr: function(){ // получаем объект XMLHttpRequest var xhr = $.ajaxSettings.xhr(); // добавляем обработчик события progress (onprogress) xhr.upload.addEventListener('progress', function(evt){ // если известно количество байт if(evt.lengthComputable) { // высчитываем процент загруженного var percentComplete = Math.ceil(evt.loaded / evt.total * 100); // устанавливаем значение в атрибут value тегаОтвет 1
С частью html - всё достаточно просто, хотя и не так безоблачно. Для прогрессбара используют или тег (реже ), или создают кастомный из любого понравившегося html-элемента. Первые два не очень кроссбраузерны, но предусмотренный в них альтернативный текст, который можно использовать для показа процентов выполнения загрузки, немного исправляет положение. Со вторым вариантом - приходится повозится в CSS, но это не проблема для людей знающих. Мы остановимся на первом, т.к. у нас сейчас основная цель - разобраться с механизмом на JavaScript. Итак, создадим простую форму для загрузки файла и после поля файла, разместим прогресс-бар, в котором нас интересуют два атрибута: value - текущее значение и max - максимальное значение. Так как мы будем использовать проценты, значения будут колебатся от нуля до ста. Соответственно стартовое значение (value) должно быть "0", а максимальное (max) - "100":
Комментариев нет:
Отправить комментарий