Перейти к содержимому
Поставьте ⭐️ проекту перевода GitHub

Сторонний JavaScript

Htmx достаточно хорошо интегрируется со сторонними библиотеками. Если библиотека генерирует события в DOM, вы можете использовать эти события для инициирования запросов в htmx.

Хороший пример такого взаимодействия — демо SortableJS:

<form class="sortable" hx-post="/items" hx-trigger="end">
<div class="htmx-indicator">Обновление...</div>
<div><input type='hidden' name='item' value='1'/>Элемент 1</div>
<div><input type='hidden' name='item' value='2'/>Элемент 2</div>
<div><input type='hidden' name='item' value='2'/>Элемент 3</div>
</form>

В случае с Sortable, как и с большинством JavaScript-библиотек, вам нужно инициализировать контент в определённый момент.

На jQuery это можно сделать следующим образом:

$(document).ready(function() {
var sortables = document.body.querySelectorAll(".sortable");
for (var i = 0; i < sortables.length; i++) {
var sortable = sortables[i];
new Sortable(sortable, {
animation: 150,
ghostClass: 'blue-background-class'
});
}
});

В htmx вместо этого используется функция htmx.onLoad, которая позволяет выбирать только из вновь загруженного контента, а не из всего документа:

htmx.onLoad(function(content) {
var sortables = content.querySelectorAll(".sortable");
for (var i = 0; i < sortables.length; i++) {
var sortable = sortables[i];
new Sortable(sortable, {
animation: 150,
ghostClass: 'blue-background-class'
});
}
})

Это гарантирует, что по мере добавления нового контента в DOM через htmx, элементы Sortable будут корректно инициализированы.

Если JavaScript добавляет в DOM контент, содержащий атрибуты htmx, необходимо убедиться, что этот контент инициализирован с помощью функции htmx.process().

Например, при получении данных через API fetch и их размещении в div-элементе, если HTML содержит атрибуты htmx, потребуется добавить вызов htmx.process() следующим образом:

let myDiv = document.getElementById('my-div')
fetch('http://example.com/movies.json')
.then(response => response.text())
.then(data => { myDiv.innerHTML = data; htmx.process(myDiv); } );

Некоторые сторонние библиотеки создают контент из HTML-шаблонов. Например, Alpine JS использует атрибут x-if в шаблонах для условного добавления контента. Изначально такие шаблоны не являются частью DOM и, если они содержат атрибуты htmx, потребуют вызова htmx.process() после их загрузки. В следующем примере используется функция $watch из Alpine для отслеживания изменения значения, которое должно активировать отображение контента по условию:

<div x-data="{show_new: false}"
x-init="$watch('show_new', value => {
if (show_new) {
htmx.process(document.querySelector('#new_content'))
}
})">
<button @click = "show_new = !show_new">Переключить новое содержимое</button>
<template x-if="show_new">
<div id="new_content">
<a hx-get="/server/newstuff" href="#">Новый кликабельный элемент</a>
</div>
</template>
</div>

Примеры интеграции htmx с веб-компонентами доступны на странице Примеры веб-компонентов.