Расширение response-targets
Это расширение позволяет указывать различные целевые элементы, которые будут заменены при получении различных кодов HTTP-ответов.
Оно использует имена атрибутов в форме hx-target-[CODE], где [CODE] — числовой код HTTP-ответа с необязательным символом подстановки в конце. Вы также можете использовать hx-target-error, которое обрабатывает коды ответов 4xx и 5xx.
Значение каждого атрибута может быть:
- CSS-селектор элемента, на который нужно нацелиться.
-
this, что указывает на то, что элемент, на котором находится атрибутhx-target, является целевым. -
closest <CSS selector>, который найдет ближайшего родительского предка, соответствующего заданному CSS-селектору (например,closest trбудет нацелен на ближайшую строку таблицы к элементу). -
find <CSS selector>, который найдет первый дочерний элемент-потомок, соответствующий заданному CSS-селектору. -
next <CSS selector>, который будет сканировать DOM в прямом направлении в поисках первого элемента, соответствующего заданному CSS-селектору. (Например,next .errorбудет нацелен на ближайший следующий элемент-сиблинг с классомerror). -
previous <CSS selector>, который будет сканировать DOM в обратном направлении в поисках первого элемента, соответствующего заданному CSS-селектору. (Например,previous .errorбудет нацелен на ближайший предыдущий элемент-сиблинг с классомerror).
Установка
<script src="https://unpkg.com/htmx.org/dist/ext/response-targets.js"></script>
Настройка (необязательно)
-
При получении заголовка ответа
HX-Retargetон отключает любой поиск, который должен был быть выполнен этим расширением, но любые ответы с ошибочными кодами состояния будут заменены (обычно они не будут, даже если целевой элемент задан через заголовок), и внутренний флаг ошибки (isError) будет изменен. Вы можете изменить это и выбрать игнорирование заголовкаHX-Retargetпри наличииhx-target-…, установив флаг конфигурацииhtmx.config.responseTargetPrefersRetargetHeaderвfalse(по умолчаниюtrue). Обратите внимание, что это расширение выполняет только простой проверку, установлен ли заголовок и существует ли целевой элемент. Оно не извлекает значение целевого элемента из заголовка, а доверяет, что оно было установлено логикой ядра HTMX. -
Обычно любой целевой элемент, уже установленный встроенными функциями HTMX или расширениями, вызываемыми ранее, будет перезаписан, если будет найден соответствующий тег
hx-target-…. Вы можете изменить это, установив флаг конфигурацииhtmx.config.responseTargetPrefersExistingвtrue(по умолчаниюfalse). Это рискованный вариант. Он имеет реальное применение, аналогичное опытному полнофункциональному тардиграду, поедающему скобки, когда никто не смотрит. -
Флаг
isErrorв членеdetailсобытия, связанного с заменой содержимого с помощьюhx-target-[CODE], будет установлен вfalse, когда получен код ошибки ответа. Это отличается от стандартного поведения. Вы можете изменить это, установив флаг конфигурацииhtmx.config.responseTargetUnsetsErrorвfalse(по умолчаниюtrue). -
Флаг
isErrorв членеdetailсобытия, связанного с заменой содержимого с помощьюhx-target-[CODE], будет установлен вfalse, когда получен код ответа без ошибки. Это не отличается от стандартного поведения. Вы можете изменить это, установив флаг конфигурацииhtmx.config.responseTargetSetsErrorвtrue(по умолчаниюfalse). Эта настройка не повлияет на код ответа 200, так как она не обрабатывается этим расширением.
Использование
Вот пример, который нацелен на div для нормального (200) ответа, но на другой div для ответа 404 (не найдено) и еще на один для всех кодов ответов 5xx:
<div hx-ext="response-targets">
<div id="response-div"></div>
<button hx-post="/register"
hx-target="#response-div"
hx-target-5*="#serious-errors"
hx-target-404="#not-found">
Register!
</button>
<div id="serious-errors"></div>
<div id="not-found"></div>
</div>
-
Ответ с URL
/registerзаменит содержимоеdivс помощьюidresponse-div, когда код ответа равен 200 (OK). -
Ответ с URL
/registerзаменит содержимоеdivс помощьюidserious-errors, когда код ответа начинается с цифры 5 (ошибки сервера). -
Ответ с URL
/registerзаменит содержимоеdivс помощьюidnot-found, когда код ответа равен 404 (Не найдено).
Иногда вам может не потребоваться обрабатывать ошибки 5xx и 4xx отдельно, в этом случае вы можете использовать hx-target-error.
<div hx-ext="response-targets">
<div id="response-div"></div>
<button hx-post="/register"
hx-target="#response-div"
hx-target-error="#any-errors">
Register!
</button>
<div id="any-errors"></div>
</div>
Коды 2xx будут обрабатываться так же, как в предыдущем примере. Однако, когда код ответа равен 5xx или 4xx, ответ с /register заменит содержимое div с помощью id any-errors.
Разрешение подстановок
Когда код ответа состояния не соответствует существующему имени атрибута hx-target-[CODE], его числовая часть, выраженная в виде строки, обрезается, а последний символ заменяется на звездочку (*). Этот процесс поиска продолжается до тех пор, пока не будет найден атрибут или больше нет цифр.
Например, если браузер получает код ошибки 404, будут выполняться следующие поиски атрибутов (в указанном порядке):
hx-target-404hx-target-40*hx-target-4*-
hx-target-*.
Если вы используете инструменты, которые не поддерживают звездочки в атрибутах HTML, вы можете использовать вместо них символ x, например, hx-target-4xx.
Примечания
-
hx-target-…наследуется и может быть помещен на родительский элемент. -
hx-target-…не может использоваться для обработки кода HTTP-ответа 200. -
hx-target-…по умолчанию учитываетHX-Retarget, отдавая ему предпочтение перед любым вычисленным целевым элементом, но это можно изменить, отключив опцию конфигурацииhtmx.config.responseTargetPrefersRetargetHeader. - Для избежания неожиданностей атрибут
hx-ext, используемый для включения этого расширения, должен быть помещен на родительский элемент, содержащий элементы с атрибутамиhx-target-…иhx-target.
См. также
-
hx-target, определяет целевой элемент для замены
Licensed under the Zero-Clause BSD License.
https://htmx.org/extensions/response-targets/