Виджет Progress Bar
Теперь, когда вы получили общее представление о виджетах jQuery UI на примере виджета Button, мы можем приступить к рассмотрению остальных виджетов, начав с виджета Progress Bar — индикатора процесса.
С помощью индикатора процесса можно информировать пользователя о достигнутом прогрессе в ходе выполнения какой-либо задачи. Этот индикатор используется лишь в случае детерминированных задач, т.е. задач, масштаб которых известен, и можно точно определить процентную долю выполненного объема работы. Другую категорию составляют недетерминированные задачи. Ход выполнения таких задач с трудом поддается количественной оценке, так что в этом случае необходимо лишь сообщить пользователю, что до завершения задачи придется немного подождать.
Отображение полезной информации о ходе выполнения задач
Никаких жестких правил относительно того, каким образом виджеты должны использоваться в веб-приложениях, не существует. В то же время в пользовательской среде, мнение которой формируется под влиянием стандартов, устанавливаемых такими операционными системами, как Windows или Mac OS, уже сложились определенные представления о том, каким должно быть поведение тех или иных элементов управления, и в частности индикатора процесса. Чтобы использование индикатора процесса приносило действительную пользу, придерживайтесь следующих правил:
Во-первых, изменяйте значение индикатора лишь в сторону увеличения. Не пытайтесь уменьшать его, если оказывается, что для завершения задачи требуется выполнить большее число действий, чем первоначально предполагалось. Индикатор процесса должен отражать степень выполнения задачи, а не оценку времени, оставшегося до ее завершения. Если существует несколько возможных путей развития вычислительного процесса, то значение индикатора должно базироваться на наиболее пессимистическом варианте развития событий. Лучше впоследствии отобразить существенный скачок значения, чем заставлять пользователя теряться в догадках относительно реального состояния дел.
Во-вторых, ни в коем случае не допускайте хождения индикатора процесса по кругу. Если у вас имеется недостаточно информации для того, чтобы отобразить разумную оценку степени выполнения задачи, используйте индикатор процесса, предназначенный для недетерминированных задач. Если значение индикатора приближается к отметке 100%, то пользователь настраивается на то, что процесс вот-вот закончится. Если же индикатор внезапно возвращается в начало шкалы, то это просто-напросто сбивает пользователя с толку и делает применение индикатора процесса бессмысленным.
Создание виджета Progress Bar
Чтобы создать индикатор процесса, следует выбрать элемент div и вызвать метод progressbar(), как показано в примере ниже:
В этом примере документ содержит элемент div с идентификатором progressDiv. Для создания индикатора процесса следует использовать пустой элемент div. Наличие любого содержимого влияет на расположение виджета на странице. В сценарии мы выбираем элемент progresDiv и вызываем метод progressbar(), передавая ему объект отображения с настройками начальной конфигурации индикатора. Виджет Progress Bar поддерживает два настраиваемых свойства, которые описаны в таблице ниже:
Свойство | Описание |
---|---|
disabled | Значение true соответствует отключенному индикатору процесса. Значение по умолчанию — false |
value | Устанавливает процент выполнения задачи, отображаемый для пользователя. Значение по умолчанию — 0 |
В данном примере начальное значение индикатора установлено равным 21%. Результат представлен на рисунке:
Использование методов виджета Progress Bar
Для виджета Progress Bar определен ряд методов, для которых используется та же форма вызова, что и для методов виджета Button. Иными словами, вы вызываете метод progressbar() и в качестве первого аргумента указываете требуемый метод. Доступные методы представлены в таблице ниже:
Метод | Описание |
---|---|
progressbar(«destroy») | Возвращает элемент div в исходное состояние, полностью удаляя из него функциональность виджета |
progressbar(«disable») | Отключает индикатор процесса |
progressbar(«enable») | Включает индикатор процесса |
progressbar(«option») | Устанавливает одно или несколько значений свойств |
progressbar(«value», value) | Получает или устанавливает значение, отображаемое индикатором процесса |
Большинство этих методов работает аналогично одноименным методам виджета Button, поэтому я не буду терять время на пояснение их примерами. Исключение составляет метод value, который позволяет получать или устанавливать значение, отображаемое индикатором процесса. Соответствующий пример приведен ниже:
В этом примере добавлена пара элементов button, которые используются для уменьшения или увеличения значения, отображаемого индикатором процесса. Каждое нажатие кнопки увеличивает значение на 10%. Результат представлен на рисунке:
Метод value всегда возвращает значение, лежащее в интервале от 0 до 100, даже если вы установите значение, выходящее за эти пределы в ту или иную сторону. Это означает, что проверку указываемых вами значений можно возложить на индикатор, а не заниматься этим самому.
Анимация индикатора процесса
Несмотря на то что внешний вид индикатора процесса согласуется с используемой темой оформления jQuery UI, он выглядит совсем просто. При создании этого индикатора jQuery UI добавляет в документ элемент div, а также определяет ряд новых классов как в новом элементе div, так и в том, для которого вызывался метод progressbar(). Сгенерированная HTML-разметка выглядит примерно следующим образом:
Класс ui-progressbar-value воздействует на элемент, который jQuery UI добавляет для отображения значения индикатора, а класс ui-progressbar — на внешний элемент div, от которого мы отталкивались. Эти классы можно привлечь для создания индикатора процесса, в котором используется анимированное GIF-изображение, как показано в примере ниже:
Для указания изображения, которое будет использоваться внутренним элементом div, можно воспользоваться CSS-свойством background-image. В данном случае указано изображение progress-animation.gif, которое представляет собой простое анимированное GIF-изображение, взятое на сайте jQuery UI:
По поводу использования изображений, подобных этому, можно сделать два замечания. Во-первых, ответственность за то, чтобы выбранное изображение согласовывалось с остальной частью темы, лежит на вас.
Во-вторых, необходимо следить за высотой изображения. По умолчанию высота индикатора процесса jQuery UI составляет 2em, что может породить проблемы в случае меньших изображений. Чтобы эти трудности не возникали, установите для свойства height элементов класса ui-progressbar значение, совпадающее с высотой изображения, которое используется. В данном примере высота изображения составляет 22 пикселя. Если не предпринять никаких мер по регулированию высоты, то границы шкалы индикатора либо окажутся спрятанными за изображением, либо будут выступать за его пределы, как показано на рисунке:
Использование событий виджета Progress Bar
Для индикатора процесса jQuery UI определены три события, которые описаны в таблице ниже:
Событие | Описание |
---|---|
create | Происходит при создании индикатора процесса |
change | Происходит при изменении значения, отображаемого индикатором процесса |
complete | Происходит, когда значение, отображаемое индикатором процесса, достигает отметки 100 |
Пример использования событий приведен ниже:
В этом примере добавлен элемент span, который используется для отображения процентного значения индикатора процесса. Результат представлен на рисунке:
Работая с событиями, следует помнить о двух вещах. Во-первых, событие complete срабатывает всякий раз, когда индикатор достигает отметки 100 или переходит ее. Это означает, что в случае многократной повторной установки значения индикатора равным, например, 100, событие может запускаться множество раз. Во-вторых, при значения индикатора, равном 100 и выше, запускаются два события — change и complete, поэтому нужно быть готовым обработать оба события, когда завершаете обновление индикатора процесса.
XMLHttpRequest: индикация прогресса
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/xmlhttprequest.
Запрос XMLHttpRequest состоит из двух фаз:
- Стадия отправки (upload). На ней данные загружаются на сервер. Эта фаза может быть долгой для POST-запросов. Для отслеживания прогресса на стадии отправки существует объект типа XMLHttpRequestUpload, доступный как xhr.upload и события на нём.
- Стадия скачивания (download). После того, как данные загружены, браузер скачивает ответ с сервера. Если он большой, то это может занять существенное время. На этой стадии используется обработчик xhr.onprogress .
Далее – обо всём по порядку.
Стадия отправки
На стадии отправки для получения информации используем объект xhr.upload . У этого объекта нет методов, он только генерирует события в процессе отправки. А они-то как раз и нужны.
Вот полный список событий:
Пример установки обработчиков на стадию отправки:
Стадия скачивания
После того, как загрузка завершена, и сервер соизволит ответить на запрос, XMLHttpRequest начнёт скачивание ответа сервера.
На этой фазе xhr.upload уже не нужен, а в дело вступают обработчики событий на самом объекте xhr . В частности, событие xhr.onprogress содержит информацию о количестве принятых байт ответа.
Все события, возникающие в этих обработчиках, имеют тип ProgressEvent, то есть имеют свойства loaded – количество уже пересланных данных в байтах и total – общее количество данных.
Демо: загрузка файла с индикатором прогресса
Современный XMLHttpRequest позволяет отправить на сервер всё, что угодно. Текст, файл, форму.
Мы, для примера, рассмотрим загрузку файла с индикацией прогресса. Это требует от браузера поддержки File API, то есть исключает IE9-.
File API позволяет получить доступ к содержимому файла, который перенесён в браузер при помощи Drag’n’Drop или выбран в поле формы, и отправить его при помощи XMLHttpRequest .
Форма для выбора файла с обработчиком submit :
Мы получаем файл из формы через свойство files элемента и передаём его в функцию upload :
Этот код отправит файл на сервер и будет сообщать о прогрессе при его отправке ( xhr.upload.onprogress ), а также об окончании запроса ( xhr.onload , xhr.onerror ).
Полный пример индикации прогресса при загрузке, основанный на коде выше:
Событие onprogress в деталях
При обработке события onprogress есть ряд важных тонкостей.
Можно, конечно, их игнорировать, но лучше бы знать.
Заметим, что событие, возникающее при onprogress , имеет одинаковый вид на стадии отправки (в обработчике xhr.upload.onprogress ) и при получении ответа (в обработчике xhr.onprogress ).
Оно представляет собой объект типа ProgressEvent со свойствами:
Сколько байт уже переслано.
Имеется в виду только тело запроса, заголовки не учитываются.
Если true , то известно полное количество байт для пересылки, и оно хранится в свойстве total .
Общее количество байт для пересылки, если известно.
А может ли оно быть неизвестно?
- При отправке на сервер браузер всегда знает полный размер пересылаемых данных, так что total всегда содержит конкретное количество байт, а значение lengthComputable всегда будет true .
- При скачивании данных – обычно сервер в начале сообщает их общее количество в HTTP-заголовке Content-Length . Но он может и не делать этого, например если сам не знает, сколько данных будет или если генерирует их динамически. Тогда total будет равно 0 . А чтобы отличить нулевой размер данных от неизвестного – как раз служит lengthComputable , которое в данном случае равно false .
Ещё особенности, которые необходимо учитывать при использовании onprogress :
Событие происходит при каждом полученном/отправленном байте, но не чаще чем раз в 50 мс.
В процессе получения данных, ещё до их полной передачи, доступен xhr.responseText , но он не обязательно содержит корректную строку.
Можно до окончания запроса заглянуть в него и прочитать текущие полученные данные. Важно, что при пересылке строки в кодировке UTF-8 кириллические символы, как, впрочем, и многие другие, кодируются 2 байтами. Возможно, что в конце одного пакета данных окажется первая половинка символа, а в начале следующего – вторая. Поэтому полагаться на то, что до окончания запроса в responseText находится корректная строка нельзя. Она может быть обрезана посередине символа.
Исключение – заведомо однобайтные символы, например цифры или латиница.
Сработавшее событие xhr.upload.onprogress не гарантирует, что данные дошли.
Событие xhr.upload.onprogress срабатывает, когда данные отправлены браузером. Но оно не гарантирует, что сервер получил, обработал и записал данные на диск. Он говорит лишь о самом факте отправки.
Поэтому прогресс-индикатор, получаемый при его помощи, носит приблизительный и оптимистичный характер.
Файлы и формы
Выше мы использовали xhr.send(file) для передачи файла непосредственно в теле запроса.
При этом посылается только содержимое файла.
Если нужно дополнительно передать имя файла или что-то ещё – это можно удобно сделать через форму, при помощи объекта FormData:
Создадим форму formData и прибавим к ней поле с файлом file и именем «myfile» :
Данные будут отправлены в кодировке multipart/form-data . Серверный фреймворк увидит это как обычную форму с файлом, практически все серверные технологии имеют их встроенную поддержку. Индикация прогресса реализуется точно так же.
Прогресс бар на JavaScript
Данный скрипт реализует анимационный «бегунок», имитирующий индикатор загрузки. Скорость анимации, цвет, размеры и другие параметры «бегунка» можно задавать в скрипте. Использовать «бегунок» можно в любом месте документа, вызвав его функцией Load_run().
Создаем функцию и основные элементы «бегунка»:
Создаем функцию для анимации бегунка:
Добавляем CSS стили к созданным элементам и вызываем функцию:
Весь скрипт целиком:
Картинки
Комментировать
А HTML-код какой должен быть?
Добавляете скрипт в документ (между тегами скрипт) и все. Либо делаете свою разметку и подключаете к ней функцию.
Ajax на практике.
Progress Bar — индикатор процесса загрузки.
Серия статей «Ajax на практике«
- Основы передачи данных
- Получение данных из формы
- Загрузка файлов
- Progress Bar — индикатор процесса загрузки.
- Запрос на чистом JavaScript
В предыдущей статье, мы коснулись темы загрузки файлов методом $.ajax() и, если обычные данные грузятся и обрабатываются на сервере достаточно быстро, то с файлами этот процесс, может занять значительно больше времени, а тем более, если выполняется мультизагрузка. В первом случае, вполне достаточно вывести для пользователя какой-нибудь анимированный прелоадер, чтоб дать ему понять, что сервер не ушёл на обед, а занимается делом. Во втором же случае, гораздо разумней показать пользователю ход выполнения операции, т.к. веся́щий секунд 5 и больше прелоадер, может утомить юзера или, того хуже, если он подумает, что сервер завис, развернется и уйдет с вашего ресурса. Вот тут-то и пригодится нам «индикатор процесса«, он же «прогресс-бар«, он же «progress bar» и т.п.
С частью html — всё достаточно просто, хотя и не так безоблачно. Для прогрессбара используют или тег
(реже ), или создают кастомный из любого понравившегося html-элемента. Первые два не очень кроссбраузерны, но предусмотренный в них альтернативный текст, который можно использовать для показа процентов выполнения загрузки, немного исправляет положение. Со вторым вариантом — приходится повозится в CSS, но это не проблема для людей знающих. Мы остановимся на первом, т.к. у нас сейчас основная цель — разобраться с механизмом на JavaScript.
Итак, создадим простую форму для загрузки файла и после поля файла, разместим прогресс-бар, в котором нас интересуют два атрибута: value — текущее значение и max — максимальное значение. Так как мы будем использовать проценты, значения будут колебатся от нуля до ста. Соответственно стартовое значение (value) должно быть «0», а максимальное (max) — «100» :
HTML (файл index.html)
В JS пишем практически всё, что разбирали в статье по «загрузке файлов», но добавляем параметр xhr, в callback-функции которого, мы можем работать с объектом XMLHttpRequest, изменяя или дополняя его поведение, получать доступ его свойствам и методам, устанавливать свои обработчики событий и т.д.:
jQuery (файл script.js)
Что касается серверной части, то там работаем с файлом/файлами, как если бы вы их загружали обычным способом.
Готово! Теперь, чтобы протестировать на локальной машине, нужно выбрать файл побольше, иначе загрузка будет происходить практически моментально и работу прогрессбара, вы попросту не заметите. Что будет в обработчике в этом случае — не важно, главное, чтоб он был. И не забудьте перед тестированием, установить значение директивы upload_max_filesize чуть больше, чем загружаемый файл. Для времменого изменения — это проще всего сделать в файле .htaccess, прописав строку:
P.S. На всякий случай, если кому-то понадобится сделать прогресс бар не на UPLOAD, а на DOWNLOAD то нужно внести маленькое изменение, а именно — установить соответствующий обработчик. Ну, естественно, что убрать лишнее. Такое может вам пригодиться, если, например, вы подгружаете на страницу большое изображение.
Пробежавшись по всем четырем статьям, я надеюсь, что у вас уже не возникнет особых сложностей с тем, как работать с методом $.ajax() и вы без труда сможете внедрить его в свои проекты. И наконец, в завершение темы «Ajax», в следующей статейке, разберем реализацию ajax-запросов на чистом (нативном) JavaScript.
Creating Progress Bar using JavaScript
A Progress Bar is used to depict the progress of any task which is being carried out. Progress Bars are generally used to show the download and upload status. In other words we can say that, Progress Bars can be used to depict the status of anything that is in progress.
To create a basic Progress Bar using JavaScript, the following steps needs to be carried out:
-
Create HTML structure for your progress bar:
The code below contains two “div” tag elements named “Progress_Status” and “myprogressbar”.
Прелоадер / Progress Bar 100% на JS
- CSS / CSS3
- Flexbox CSS
- JavaScript
- JavaScript с нуля
- JS и Jquery
- Уроки по 1С-Битрикс
- Контент менеджер
- Авторизация на сайте
- Элементы управления
- Работа с информацией
- Управление структурой
- Сайт на 1С-Битрикс
- Создание landing page
- Контент менеджер
- Видео новости
- Модули расширений
- Расширения и плагины
- Bootstrap
ПОДПИСКА на УРОКИ
В данном уроке разберем как сделать прогресс бар который будет в роли прелоадера и настроить его под свои задачи. При помощи настроек можно изменить время загрузки, цвет, направление и его скорость.
Мне понравился данный плагин из за его гибкости и простоты настроек. Попался он мене на GitHab , возможно вам он понравится, скачивайте и внедряйте его на свои проекты.
Создаем прогресс Бар
See the Pen rYqjBr by Denis (@Dwstroy) on CodePen.
Открываем редактор в котором будем работать в моем случае это PhpStorm , создаем index файл, в заголовке пропишем Progress Bar. Подключаем Jquery .
Делаем две директории под CSS и JS скрипты. Затем, копирую plugin.js в JS директорию. Тут же создаем файл script.js в котором будем описывать настройки прогресс Бара.
Переходим в директорию CSS создаем style.css в нем будем описывать стили.
Теперь эти все файлы подключаем к index.html . Стили подключаем в head , а скрипты в нижней части body .
После открывающего тега bod прописываем блок Див с классом .dws-progress-bar который будет выводить саму анимацию.
Затем переходим в script.js , через функцию $(document) получаем доступ к объектам страницы, пишем событие .ready которое выстрелит в момент готовности DOM , то есть когда полностью загрузится страница, сработает данная функция.
Далее описываем функцию в которой обращаемся к блоку с классом .dws-progress-bar , вызываем круговой прогресс и в нем мы чуть позже передадим параметры.
Оформляем Progress Bar стилями в CSS
В первую очередь придадим нашему элементу стили. Открываем style.css , и с позиционируем круговой прогресс по середине. Прописываем данную конструкцию, в которой мы обращаемся к классу, и позиционируем блок по середине.
Таким же образом центруем в этом блоке процент загрузки. Увеличим текст, заменим шрифт, сделаем его пожирнее, и изменим цвет.
Далее переходим в script и приступим к анимированию.
Изменим цвет, color: «#2af7eb » , сделаем обводку пожирнее и по шире, придадим ей анимацию, указываем percent: 0 , и вызываем круглый прогресс где задаем время и процент анимирование.
При помощи данного параметра counter_clockwise: true можем анимировать в обратном направлении. Поменяв на false мы его отключаем или при желании можно удалить.
С помощью данной строки starting_position: 50 , можем поменять начальную позицию анимации.
Таким же образом вы можете по экспериментировать с временем загрузки, ее процентом и другими параметрами, настраивая данную анимацию под свои задачи.
Делаем прелоадер на странице
Для примера, разместим страницу где перед ее загрузкой будем показывать данную анимашку, сделаем как простенький прелоадер.
Создавать с нуля ее не будем, у меня она подготовлена, для этого я открываю ее и копирую код в наши файлы.
Как видим прелоадер работает, но отображается он, на заднем плане, добавим для него z-index: 100;
Следующий момент, перед загрузкой страницы нам нужно ее скрыть пока полностью не прогрузятся все элементы, в этот момент показать прелоадер, а затем когда страница прогрузится его скроем.
Обернем наш Прогресс бар в блок div с ID preloader .
Затем в стилях пропишем, для того чтобы прелоадер находился всегда с верху и не прокручивался когда опускаешь страничку, зафиксируем его, и отцентруем. Сделаем фон черным, и добавим z-index: 100;
Для того чтобы прелойдер после загрузки исчез, допишем в скрипте следующий код. Устанавливаем обработчик событий, создаем переменную и присваиваем ей значение, когда полностью страница прогрузится, мы плавно скрываем данные элементы при помощи данной функции.
Получили довольно не плохую анимашку, которую можете использовать для своих проектов.
В принципе на этом все, кому понравилось, пищите комментария, с вами был Денис, скоро увидимся.
Прогресс бар на JavaScript
We recommend upgrading to the latest Google Chrome or Firefox.
Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
New pull request
Clone with HTTPS
Use Git or checkout with SVN using the web URL.
Downloading .
Want to be notified of new releases in cogan/Javascript-Progress-Bar ?
Launching GitHub Desktop .
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop .
If nothing happens, download GitHub Desktop and try again.
Launching Xcode .
If nothing happens, download Xcode and try again.
Launching Visual Studio .
Permalink
Type | Name | Latest commit message | Commit time | ||
---|---|---|---|---|---|
Failed to load latest commit information. | |||||
Type | Name | Latest commit message | Commit time |
---|---|---|---|
Failed to load latest commit information. | |||