Spec-Zone.ru › htmx

Руководство по событиям htmx

Подписывайтесь на события htmx, чтобы записывать их в журнал, отменять и изменять поведение запросов и подстановки.

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

Прослушивание событий

Событие htmx можно прослушивать тремя способами.

Используйте htmx.on(), который по умолчанию прослушивает document:

htmx.on('htmx:after:swap', function (evt) {
    console.log('swapped', evt.detail.ctx.target);
});

Используйте стандартный метод addEventListener:

document.body.addEventListener('htmx:after:init', function (evt) {
    setUpElement(evt.detail.elt);
});

Или добавьте атрибут hx-on:* непосредственно к элементу:

<button hx-post="/example"
        hx-on:htmx:config:request="ctx.request.body.set('source', 'button')">
    Post Me!
</button>

События htmx всплывают, поэтому обработчик на document или document.body видит события от всех элементов. Используйте атрибут hx-on:*, если нужно обрабатывать события только одного элемента.

Детали события

Большинство событий htmx содержат объект detail. Для событий запроса и подстановки detail.ctx — это контекст запроса. Он содержит исходный элемент, целевой элемент, стиль подстановки, запрос и, после получения ответа, сам ответ.

htmx.on('htmx:before:request', function (evt) {
    let ctx = evt.detail.ctx;
    console.log(ctx.request.method, ctx.request.action, ctx.target);
});

В атрибуте hx-on:* каждое свойство detail уже доступно в текущей области видимости, поэтому вместо event.detail.ctx можно написать ctx.

В событиях жизненного цикла элементов используется detail.elt — элемент, обработанный htmx.

Отмена события

События htmx можно отменить. Вызовите preventDefault(), чтобы остановить дальнейшую работу htmx:

htmx.on('htmx:before:request', function (evt) {
    if (!isLoggedIn()) {
        evt.preventDefault();
    }
});

Отмена по-разному влияет на каждое событие:

Событие Эффект отмены
htmx:confirm отменяет встроенное подтверждение. Вызовите detail.issueRequest() или detail.dropRequest() самостоятельно
htmx:before:request запрос не отправляется
htmx:before:response тело ответа не читается, подстановка не выполняется
htmx:after:request ответ читается, но подстановка не выполняется
htmx:before:swap задача подстановки не запускается
htmx:before:init элемент не инициализируется
htmx:before:process узел и его потомки не обрабатываются

Жизненный цикл событий

События запроса

Эти события возникают в указанном порядке при каждом запросе.

Событие Когда возникает
htmx:confirm перед обработкой htmx атрибута hx-confirm
htmx:config:request перед кодированием данных запроса. Здесь можно изменить ctx.request
htmx:before:request непосредственно перед fetch()
htmx:before:response после fetch(), до чтения тела ответа
htmx:after:request после чтения тела ответа
htmx:response:error код состояния ответа — 400 или выше
htmx:error при выполнении запроса или подстановки возникло исключение
htmx:finally:request жизненный цикл завершился, в том числе при ошибке

События подстановки

Событие Когда возникает
htmx:before:swap перед обновлением DOM. detail.tasks содержит запланированные подстановки
htmx:before:settle после вставки, до задач стабилизации
htmx:after:settle после выполнения задач стабилизации
htmx:after:swap после обновления DOM
htmx:finally:swap в конце жизненного цикла подстановки
htmx:before:viewTransition перед началом перехода представления
htmx:after:viewTransition после завершения перехода представления

События жизненного цикла элементов

Событие Когда возникает
htmx:before:process перед обработкой узла DOM средствами htmx
htmx:after:process после обработки узла DOM средствами htmx
htmx:before:init перед инициализацией элемента
htmx:after:init после инициализации элемента
htmx:before:cleanup перед удалением данных htmx из элемента
htmx:after:cleanup после удаления данных htmx из элемента

События истории

Событие Когда возникает
htmx:before:history:update перед обновлением истории браузера
htmx:after:history:update после обновления истории браузера
htmx:after:history:push после добавления URL в историю
htmx:after:history:replace после замены URL в истории
htmx:before:history:restore перед восстановлением страницы из истории

Полный список, включая события-триггеры load, intersect и every, см. в справочнике событий.

Типовые решения

Инициализация сторонней библиотеки

Новый контент, добавленный htmx с помощью подстановки, неизвестен другим вашим библиотекам. Подпишитесь на htmx:after:init, чтобы настроить его:

htmx.on('htmx:after:init', function (evt) {
    setUpElement(evt.detail.elt);
});

Также можно использовать htmx.onLoad() — сокращённую запись для этого.

Добавление значения в каждый запрос

Событие htmx:config:request возникает до кодирования тела запроса, поэтому ctx.request.body пока ещё является объектом FormData:

htmx.on('htmx:config:request', function (evt) {
    evt.detail.ctx.request.body.set('csrf-token', getToken());
});

Чтобы вместо этого добавить заголовок, присвойте значение ctx.request.headers:

htmx.on('htmx:config:request', function (evt) {
    evt.detail.ctx.request.headers['X-CSRF-Token'] = getToken();
});

Изменение целевого элемента или стиля подстановки

Оба параметра находятся в контексте, поэтому их можно изменить вплоть до момента подстановки:

htmx.on('htmx:before:swap', function (evt) {
    if (evt.detail.ctx.response.status === 404) {
        evt.detail.ctx.target = document.querySelector('#errors');
    }
});

Декларативный вариант этого решения описан в разделе hx-status.

Запись событий в журнал

Установите для htmx.config.logAll значение true, чтобы записывать все события htmx в консоль:

htmx.config.logAll = true;

Также можно задать это из HTML:

<meta name="htmx-config" content="logAll:true">

htmx всегда записывает на уровне ошибок события, в деталях которых содержится error, а на уровне предупреждений — события, в деталях которых содержится warn. logAll добавляет все остальные события.

См. также

  • Скрипты на стороне клиента
  • Атрибуты hx-on:*
  • Справочник событий
  • Руководство по созданию расширений htmx, в котором показано, как перехватывать те же события из расширения

Licensed under the Zero-Clause BSD License.
https://four.htmx.org/docs/htmx-events-guide/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API