htmx 响应目标扩展

此扩展允许你指定在收到不同的 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/[email protected]/response-targets.js"></script>

配置(可选)

  • 当收到HX-Retarget响应报头时,它会禁用此扩展执行的任何查找,但任何具有错误状态代码的响应都将被交换(通常不会交换,即使通过报头设置目标),并且内部错误标志(isError)将被修改。你可以更改此设置,并选择在 hx-target 时忽略 HX-Retarget 报头-...通过将配置标志 htmx.config.responseTargetPrefersRetargetHeader 设置为 false(默认值为 true)来实现。请注意,此扩展仅执行简单的检查是否设置了 header 以及 target 是否存在。它没有从 header 中提取 target 的值,但相信它是由 HTMX 核心逻辑设置的。

  • 通常,如果匹配的 hx-target,则之前调用的 HTMX 内置函数或扩展已经建立的任何目标都将被覆盖-...标签。你可以使用配置标志 htmx.config.responseTargetPrefersExisting 将其更改为 true(默认值为 false)。这是且有风险的选择。

  • 收到错误响应代码时,与使用 hx-target-[CODE] 交换内容关联的事件的详细信息成员上的 isError 标志将设置为 false。这与默认行为不同。你可以通过将配置标志 htmx.config.responseTargetUnsetsError 设置为 false(默认值为 true)来更改此设置。

  • 当收到非错误响应代码时,与使用 hx-target-[CODE] 交换内容关联的事件的详细信息成员上的 isError 标志将设置为 false。这与默认行为没有什么不同。你可以通过将配置标志 htmx.config.responseTargetSetsError 设置为 true(默认值为 false)来更改此设置。此设置不会影响响应代码 200,因为它不由此扩展处理。

用法

下面是一个针对正常(200)响应的示例div,另一个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>
  • 当响应代码为 200 (OK) 时,来自 /register URL 的响应会将 div 的内容替换成 id 为 response-div 的内容。
  • 当响应代码以数字 5(服务器错误)开头时,来自 /register URL 的响应会将 ID 对应的 div 的内容替换为严重错误。
  • 当响应代码为 404 (Not Found) 时,来自 /register URL 的响应会将 id 对应的 div 的内容替换成 not-found。

有时你可能不想分别处理 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 的响应将用 any-errors 替换 id 对应的 div 的内容。

通配符解析

当状态响应代码与现有 hx-target-[CODE] 属性名称不匹配时,其表示为字符串的数字部分将被修剪,最后一个字符将替换为星号 (*)。此查找过程将继续,直到找到属性或没有更多数字。

例如,如果浏览器收到 404 错误代码,将查找以下属性名称(按给定顺序):

  • hx-target-404
  • hx-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, 指定要交换的目标元素