В моих предыдущих статьях мы узнали, как использовать перетаскивание файлов HTML5 , открывать файлы с помощью JavaScript и асинхронно загружать файлы с помощью Ajax . В заключительной части этой серии мы рассмотрим самую захватывающую часть процесса: графические индикаторы выполнения!
Индикаторы загрузки файла обеспечивают необходимую обратную связь с пользователем, но их было очень сложно реализовать. До сих пор это так. И Firefox, и Chrome поддерживают объект XMLHttpRequest2, который предлагает обработчик событий прогресса. Но сначала давайте рассмотрим, как будет реализован наш индикатор выполнения…
Тег прогресса HTML5
Новый тег progress
- значение : текущее значение прогресса
- max : значение при завершении
Тег был бы идеальным в этой демонстрации и, хотя он поддерживается в Chrome, он только появился в Firefox 6 . Кроме того, ни один браузер не предлагает много свойств стиля, поэтому я отбросил его в пользу стандартного тега p
Это добавляется в детстве к div
Styling the Progress Bar
Наш тег p
#progress p
{
display: block;
width: 240px;
padding: 2px 5px;
margin: 2px 0;
border: 1px inset #446;
border-radius: 5px;
}
Для самой зеленой полосы я создал рисунок, который был в два раза шире элемента прогресса (500 пикселей). Левый 250px окрашен, а правый 250px прозрачен:
Этот рисунок используется в качестве фонового изображения для индикатора выполнения и расположен на «X% 0», где X% указывает на долю, которая остается (не завершена), т.е.
- прогресс начинается с «background-position: 100% 0», то есть 100% осталось
- прогресс заканчивается на «background-position: 0% 0», т.е. ничего не осталось
- «Background-position: 30% 0» означает, что 70% выполнено:
Сплошной цвет применяется путем установки класса при успешной или неудачной загрузке:
#progress p.success
{
background: #0c0 none 0 0 no-repeat;
}
#progress p.failed
{
background: #c00 none 0 0 no-repeat;
}
Реализация индикатора выполнения в JavaScript
Теперь мы можем изменить нашу функцию UploadFile (). Когда встречается действительный файл JPG, мы добавляем новый тег p
// upload JPEG files
function UploadFile(file) {
var xhr = new XMLHttpRequest();
if (xhr.upload && file.type == "image/jpeg" && file.size <= $id("MAX_FILE_SIZE").value) {
// create progress bar
var o = $id("progress");
var progress = o.appendChild(document.createElement("p"));
progress.appendChild(document.createTextNode("upload " + file.name));
Теперь нам требуется функция обработчика события «progress». Он получает объект со свойствами .loaded и .total — для вычисления нового backgroundPosition необходима небольшая математика:
// progress bar
xhr.upload.addEventListener("progress", function(e) {
var pc = parseInt(100 - (e.loaded / e.total * 100));
progress.style.backgroundPosition = pc + "% 0";
}, false);
Если вы знакомы с Ajax, вы узнаете обработчик события onreadystatechange. Это определяет, когда загрузка была завершена, и соответственно отображает стиль индикатора выполнения (устанавливает класс «success», если загрузка прошла успешно):
// file received/failed
xhr.onreadystatechange = function(e) {
if (xhr.readyState == 4) {
progress.className = (xhr.status == 200 ? "success" : "failure");
}
};
Наконец, мы отправляем файл на наш сервер PHP, как и раньше:
// start upload
xhr.open("POST", $id("upload").action, true);
xhr.setRequestHeader("X-FILENAME", file.name);
xhr.send(file);
}
}
Наконец, у нас есть решение, которое:
- позволяет перетаскивать файлы на элемент веб-страницы
- анализирует и отображает удаленные файлы на клиенте
- асинхронно загружает файлы на сервер
- показывает графическую индикатор выполнения во время загрузки
- использует прогрессивное улучшение для поддержки большинства браузеров
- кодируется без использования библиотеки JavaScript.
Пожалуйста, просмотрите демонстрационную страницу , однако обратите внимание, что она размещена на сервере без PHP, поэтому загрузка файлов не произойдет. Чтобы проверить это, пожалуйста, загрузите файлы для проверки кода и разместите его на своем собственном сервере.
Я надеюсь, что вам понравилась эта серия и вы думаете, как перетаскивание файлов может помочь вашему веб-приложению.
Если вам понравилось читать этот пост, вы полюбите Learnable ; место, чтобы узнать новые навыки и приемы у мастеров. Участники получают мгновенный доступ ко всем электронным книгам и интерактивным онлайн-курсам SitePoint, таким как Learn HTML5 .