Прогресс-бары

HTMX предоставляет удобный способ интеграции динамических обновлений на веб-странице, включая реализацию прогресс-баров. Прогресс-бары часто используются для отображения состояния выполнения длительных операций, таких как загрузка файлов, обработка данных или выполнение запросов на сервер. В HTMX процесс обновления интерфейса можно управлять через HTML-атрибуты и минимальные скрипты JavaScript, что упрощает создание интерактивных элементов без необходимости написания сложного кода.

Простой прогресс-бар

Для начала необходимо создать сам прогресс-бар в HTML. Этот элемент будет отображать состояние выполнения операции, которое будет изменяться в процессе работы. Типичный прогресс-бар выглядит как элемент с типом progress.

<progress id="progress-bar" value="0" max="100"></progress>

Здесь:

  • value — текущее значение прогресса.
  • max — максимальное значение, которое обычно равно 100, что представляет собой 100% выполнения.

HTMX позволяет легко управлять этим значением с помощью атрибутов hx-get, hx-target и hx-trigger. Для обновления прогресс-бара сервер может отправлять обновления о текущем прогрессе через специальный обработчик, который изменяет значение атрибута value.

Взаимодействие с сервером

Прогресс-бар часто используется в связке с серверными запросами, чтобы показывать пользователю процесс обработки данных или загрузки файлов. Для реализации этой функциональности нужно настроить сервер, который будет отправлять информацию о текущем состоянии прогресса. HTMX позволяет выполнить асинхронный запрос и обновить DOM, что позволяет динамично изменять значение прогресс-бара без перезагрузки страницы.

Пример на серверной стороне может выглядеть следующим образом (например, на Python с использованием Flask):

from flask import Flask, render_template, jsonify
import time

app = Flask(__name__)

@app.route('/progress')
def progress():
    for i in range(101):
        time.sleep(0.1)
        yield f'dat a: {i}\n\n'

@app.route('/')
def index():
    return render_template('index.html')

В данном примере сервер генерирует поток данных, отправляя прогресс с интервалом в 0,1 секунды. Этот поток можно будет использовать на клиентской стороне для обновления значения прогресс-бара.

Клиентская сторона: получение данных через HTMX

На клиентской стороне необходимо использовать HTMX для отслеживания прогресса и обновления прогресс-бара. Для этого используется атрибут hx-get, который инициирует запрос к серверу, и атрибут hx-target, указывающий, какой элемент на странице нужно обновить.

<button hx-get="/progress" hx-target="#progress-bar" hx-trigger="click">
    Начать процесс
</button>

<progress id="progress-bar" value="0" max="100"></progress>

В этом примере:

  • Кнопка с атрибутом hx-get="/progress" запускает запрос на сервер, который начинает передавать данные о прогрессе.
  • Атрибут hx-target="#progress-bar" указывает, что данные нужно обновить в элементе с ID progress-bar.
  • Когда кнопка нажата, HTMX запускает запрос, и сервер отправляет данные, которые обновляют значение прогресс-бара.

Обработка потока данных на клиентской стороне

Для получения потока данных от сервера HTMX использует EventSource. При получении данных от сервера, HTMX обновляет целевой элемент с использованием соответствующего значения. Сервер может отправлять данные о текущем прогрессе, а клиентская сторона обновляет значение прогресс-бара, пока не завершится процесс.

На стороне клиента сервер может отправлять сообщения в формате, который HTMX может обрабатывать. Каждый прогресс-апдейт от сервера должен быть представлен в виде сообщения, как это показано в примере выше (data: {value}\n\n). HTMX автоматически будет обрабатывать эти сообщения и обновлять атрибут value прогресс-бара.

<progress id="progress-bar" value="0" max="100" hx-get="/progress" hx-target="#progress-bar" hx-trigger="load"></progress>

Здесь атрибут hx-trigger="load" означает, что запрос будет отправлен сразу при загрузке страницы. Прогресс-бар начнёт обновляться сразу после загрузки страницы и будет обновляться по мере получения данных с сервера.

Обработка ошибок

При реализации прогресс-баров важно учитывать возможные ошибки, которые могут возникать при длительных запросах. Например, если сервер не может обработать запрос или произошла ошибка в процессе загрузки, необходимо уведомить пользователя. Для этого можно использовать стандартные механизмы HTMX для обработки ошибок.

<div hx-get="/progress" hx-target="#progress-bar" hx-trigger="click" hx-on="htmx:error: alert('Произошла ошибка')">
    Начать процесс
</div>

Здесь используется атрибут hx-on, чтобы привязать обработчик события ошибки. В случае сбоя будет показано сообщение с уведомлением об ошибке.

Визуальные улучшения прогресс-бара

Чтобы прогресс-бар выглядел более привлекательным и информативным, можно добавить дополнительные элементы, такие как текстовое описание текущего прогресса. Например, можно использовать элемент <span> для отображения процента выполнения.

<progress id="progress-bar" value="0" max="100"></progress>
<span id="progress-text">0%</span>

Используя HTMX, можно динамически обновлять текстовое значение рядом с прогресс-баром.

<button hx-get="/progress" hx-target="#progress-bar, #progress-text" hx-trigger="click">
    Начать процесс
</button>

<script>
  document.body.addEventListener('htmx:beforeSwap', function(event) {
    if (event.target.id === 'progress-bar') {
      let value = event.detail.xhr.responseText;
      document.getElementById('progress-text').innerText = value + '%';
    }
  });
</script>

Здесь мы обновляем и текстовое значение, и сам прогресс-бар одновременно. В этом случае HTMX будет перехватывать обновление и изменять текстовый элемент в соответствии с процентом выполнения.

Использование прогресс-баров в реальных приложениях

Прогресс-бары с использованием HTMX могут быть полезными в различных веб-приложениях, где необходимо обновлять состояние в реальном времени. Это может включать в себя:

  • Загрузку и отправку файлов.
  • Отображение состояния выполнения задач (например, обработки видео или больших данных).
  • Обновление информации о процессе на сервере, где пользователь может наблюдать за прогрессом.

Особенность использования HTMX заключается в том, что всё это можно реализовать без необходимости написания сложного JavaScript-кода, благодаря простым атрибутам HTML и механизмам обработки событий. Это делает HTMX отличным инструментом для быстрого создания динамичных и интерактивных интерфейсов.

Заключение

Использование HTMX для создания прогресс-баров позволяет легко интегрировать динамичные обновления в веб-приложения. С помощью простого HTML, серверных потоков данных и минимального JavaScript можно создать удобные и визуально привлекательные элементы для отображения прогресса выполнения операций.