Атрибут hx-swap
Атрибут hx-swap позволяет вам указать, как ответ будет заменен относительно целевого элемента AJAX-запроса. Если вы не укажете опцию, по умолчанию используется htmx.config.defaultSwapStyle (innerHTML).
Возможные значения этого атрибута:
innerHTML— Заменить внутренний HTML целевого элементаouterHTML— Заменить весь целевой элемент ответомtextContent— Заменить текстовое содержимое целевого элемента, не разбирая ответ как HTMLbeforebegin— Вставить ответ перед целевым элементомafterbegin— Вставить ответ перед первым дочерним элементом целевого элементаbeforeend— Вставить ответ после последнего дочернего элемента целевого элементаafterend— Вставить ответ после целевого элементаdelete— Удаляет целевой элемент независимо от ответаnone— Не добавляет содержимое из ответа (элементы вне контекста всё равно будут обработаны).
Эти опции основаны на стандартных наименованиях DOM и спецификации Element.insertAdjacentHTML.
Таким образом, в этом коде:
<div hx-get="/example" hx-swap="afterend">Получить HTML и добавить его</div>div отправит запрос к /example и добавит возвращённое содержимое после div.
Атрибуты hx-swap поддерживают модификаторы для изменения поведения замены. Они описаны ниже.
Если вы хотите использовать новый View Transitions API при выполнении замены, вы можете использовать опцию transition:true для вашей замены. Вы также можете включить эту функцию глобально, установив опцию htmx.config.globalViewTransitions в true.
Вы можете изменить время, которое htmx будет ждать после получения ответа для замены содержимого, добавив модификатор swap:
<!-- ожидаем 1 секунду перед выполнением замены после получения ответа --><div hx-get="/example" hx-swap="innerHTML swap:1s"> Получить HTML и добавить его</div>Вы также можете изменить время между заменой и логикой стабилизации, добавив модификатор settle:
<!-- ожидаем 1 секунду перед выполнением замены после получения ответа --><div hx-get="/example" hx-swap="innerHTML settle:1s"> Получить HTML и добавить его</div>Эти атрибуты могут быть использованы для синхронизации htmx с таймингом эффектов CSS-переходов.
По умолчанию htmx обновит заголовок страницы, если найдет тег <title> в содержимом ответа. Вы можете отключить это поведение, установив опцию ignoreTitle в true.
Вы также можете изменить поведение прокрутки целевого элемента, используя модификаторы scroll и show, оба из которых принимают значения top и bottom:
<!-- этот div с фиксированной высотой будет прокручиваться вниз после добавления содержимого --><div style="height:200px; overflow: scroll" hx-get="/example" hx-swap="beforeend scroll:bottom"> Получить какой-то HTML, добавить его и прокрутить в самый низ</div><!-- получаем некоторое содержимое и добавляем его в #another-div, обеспечивая видимость верхней части #another-div в области просмотра --><div hx-get="/example" hx-swap="innerHTML show:top" hx-target="#another-div"> Получить какое-то содержимое</div>Если вы хотите нацелиться на другой элемент для прокрутки или показа, вы можете указать CSS-селектор после scroll: или show:, за которым следует :top или :bottom:
<!-- получаем некоторое содержимое и добавляем его в текущий div, обеспечивая видимость верхней части #another-div в области просмотра --><div hx-get="/example" hx-swap="innerHTML show:#another-div:top"> Получить какое-то содержимое</div>Вы также можете использовать window:top и window:bottom, чтобы прокрутить к верхней и нижней части текущего окна:
<!-- получаем некоторое содержимое и добавляем его в текущий div, обеспечивая прокрутку области просмотра к самому верху --><div hx-get="/example" hx-swap="innerHTML show:window:top"> Получить какое-то содержимое</div>Для усиленных ссылок и форм поведение по умолчанию — show:top. Вы можете отключить это глобально с помощью htmx.config.scrollIntoViewOnBoost или использовать hx-swap="show:none" для конкретного элемента:
<form action="/example" hx-swap="show:none"> ...</form>htmx сохраняет фокус между запросами для полей ввода, у которых есть определённый атрибут id. По умолчанию htmx предотвращает автоматическую прокрутку к фокусированным полям ввода между запросами, что может быть нежелательным поведением при длительных запросах, когда пользователь уже прокрутил страницу. Чтобы включить прокрутку к фокусу, вы можете использовать focus-scroll:true:
<input id="name" hx-get="/validation" hx-swap="outerHTML focus-scroll:true"/>В качестве альтернативы, если вы хотите, чтобы страница автоматически прокручивалась к фокусированному элементу после каждого запроса, вы можете изменить глобальную конфигурацию htmx, установив значение htmx.config.defaultFocusScroll в true. Затем отключите это для конкретных запросов, используя focus-scroll:false:
<input id="name" hx-get="/validation" hx-swap="outerHTML focus-scroll:false"/>hx-swapнаследуется и может быть размещён на родительском элементе.- Значение по умолчанию для этого атрибута —
innerHTML. - Из-за ограничений DOM невозможно использовать метод
outerHTMLна элементе<body>. htmx изменитouterHTMLна<body>, чтобы использоватьinnerHTML. - Задержка замены (
swap) по умолчанию составляет 0 мс. - Задержка стабилизации (
settle) по умолчанию составляет 20 мс.