HTMX - AJAX



HTMX 的主要目的是直接从 HTML 发送 AJAX 请求,无需使用 JavaScript,这可以通过 HTMX 属性实现。当触发特定事件时,以下列出的属性之一将向给定的 URL 发起 AJAX 请求。

HTMX 属性

下面列出了最常用的属性,这些属性用于直接从 HTML 发送 AJAX 请求。每个属性都接收一个 URL 来发出 AJAX 请求。

  • hx-get: 此属性对给定的 URL 执行 GET 请求。
  • hx-post: 此属性对给定的 URL 执行 POST 请求。
  • hx-put: 此属性对给定的 URL 执行 PUT 请求。
  • hx-patch: 此属性对给定的 URL 执行 PATCH 请求。
  • hx-delete: 此属性对给定的 URL 执行 DELETE 请求。

HTMX 中 AJAX 请求的示例

当元素被触发时,该元素将向给定的 URL 发出指定类型的请求。

触发请求

AJAX 请求由自然事件触发,例如元素上的鼠标移入或移出。像输入框、文本区域和选择框在更改事件时触发。表单在提交事件时触发,其他元素在点击事件时触发。要自定义这些行为,可以使用 hx-trigger 属性指定哪个事件将是请求的原因。

<div hx-post="/mouse_leave" hx-trigger="mouseleave">
 [Here Mouse, Mouse!]
</div>

触发器修饰符:如果希望请求只触发一次,可以修改行为,只需为触发器添加 once 关键字。您可以查看下面列出的修饰符。

  • once: 仅触发一次请求。
  • changed: 如果元素的值已更改,则触发请求。
  • delay:<时间间隔>: 在给定时间后触发请求,如果再次触发,则倒计时将从头开始。
  • throttle:<时间间隔>: 与延迟相同,但如果事件在限制结束前发生,则该事件将被丢弃。因此,请求将在时间结束时触发。
  • from:<CSS 选择器>: 等待不同元素的事件。这可用于在键盘快捷键上触发请求。
<div hx-post="/mouse_leave" hx-trigger="mouseleave once">
 [Here Mouse, Mouse!]
</div>

触发器过滤器:您可以应用触发器过滤器来触发请求。为此,您可以在事件名称后使用方括号 ([])。以下示例仅在元素的 Control-Click 上触发。

<div hx-get="/clicked" hx-trigger="click[ctrlKey]">
 Control Click
</div>

特殊事件:有一些特殊事件可用于 hx-trigger 属性。

  • load: 元素首次加载时触发。
  • revealed: 元素首次滚动到视口时触发。
  • intersect: 元素首次与视口相交时触发。这支持两个附加选项
    • root:<选择器>: 交叉点的根元素的 CSS 选择器。
    • threshold:<浮点数>: 0.0 到 1.0 表示触发事件所需的交叉量。
如果您有高级用例,还可以使用自定义事件来触发请求。

轮询:当您希望元素不等待事件时,可以通过使用 every 作为 hx-trigger 属性的值,在元素上设置轮询。

如下面的伪代码所示,它每 2 秒发出一次对 /content 的 GET 请求,并将响应加载到 div 元素中。

<div hx-get="/content" hx-trigger="every 2s"></div>

加载轮询:还有另一种轮询,即加载轮询,其中元素指定一个带有指定时间延迟的 load 触发器,并用响应替换自身。

<div hx-get="/messages"
 hx-trigger="load delay:1s"
 hx-swap="outerHTML"
>
</div>

请求指示器

发出 AJAX 请求时,您需要通知用户请求已启动。您可以对子元素使用 htmx-indicator 类,如下面的伪代码所示。

<button hx-get="/click">
 Click Me!
    <img class="htmx-indicator" src="/spinner.gif">
</button>

在此代码中,我们有一个按钮,当单击该按钮时,将触发 GET 请求,并且此时将弹出一个加载动画,向用户显示 AJAX 请求已启动。

目标

您可以使用 hx-target 属性设置要加载请求响应的元素。在此代码中,您可以看到请求的响应将呈现到 div#search-results 元素上。

<input type="text" name="q"
 hx-get="/trigger_delay"
 hx-trigger="keyup delay:500ms"
 hx-target="#search-results"
>
<div id="search-results"></div>

交换

内容替换目标元素的 innerHTML。您可以使用 hx-swap 属性修改此行为。有一些预定义的值,例如 innerHTML、outerHTML、afterbegin 等值。

  • 变形交换:变形交换尝试将新内容合并到现有 DOM 中。
  • 视图过渡:视图过渡 API 允许开发人员在不同的 DOM 状态之间创建动画过渡,但目前并非所有浏览器都支持它。
  • 交换选项:当您使用 hx-swap 属性时,交换中有一些特定的选项。

交换修饰符出现在指定交换样式之后,并用冒号分隔。

同步

通过使用 hx-sync 属性在两个元素之间执行同步。当您希望来自一个元素的请求取代另一个元素的请求,或等待另一个元素的请求完成时,这将是必需的。

CSS 过渡

HTMX 支持无需使用 JavaScript 即可进行过渡,这是 HTMX 最好的特性之一。

<div id="div1">Original Content</div>

<div id="div1" class="red">New Content</div>
.red {
 color: red;
 transition: all ease-in 1s ;
}

两个 div 具有相同的 id 和第二个元素上的红色类,因此当 HTMX 交换此新内容时,定义的 CSS 将应用于新内容。

带外交换

如果要将响应中的内容直接交换到 DOM 中,可以使用 hx-swap-oob 属性,其值为 true

<div id="message" hx-swap-oob="true">Swap me directly!</div>

参数

对于触发 AJAX 请求的元素,参数是必需的。导致请求的元素将包含其值(如果存在)。如果元素是表单,它将包含其中所有输入的值。

  • 文件上传:如果要通过 htmx 请求上传文件,可以将 hx-encoding 属性设置为 multipart/form-data。
  • 额外值:可以通过使用 hx-values 属性添加额外值。

确认请求

在触发和请求之前,最好确认请求,为此可以使用 hx-confirm 属性。这允许您使用简单的 javascript 对话框确认操作。

<button hx-delete="/account" hx-confirm="Are you sure?">
 Delete My Account
</button>
广告