hx-trigger

hx-trigger 属性允许您指定什么触发 AJAX 请求。触发器值可以是以下之一:

标准事件

标准事件指的是 Web API 事件(例如 click、keydown、mouseup、load)。

标准事件,例如 click,可以像这样指定为触发器:

<div hx-get="/clicked" hx-trigger="click">Click Me</div>

标准事件过滤器

事件可以通过在事件名称后用方括号包围布尔 JavaScript 表达式来过滤。如果该表达式求值为 true,则事件将被触发,否则将被忽略。标准事件过滤器 需要 eval

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

如果点击事件触发时 event.ctrlKey 属性设置为 true,此事件将触发。

条件还可以引用全局函数或状态

<div hx-get="/clicked" hx-trigger="click[checkGlobalState()]">Control Click Me</div>

并且可以使用标准 JavaScript 语法组合

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

请注意,表达式中使用的所有符号将首先针对触发事件解析,然后针对全局命名空间解析,因此 myEvent[foo] 将首先在事件上查找名为 foo 的属性,然后查找名为 foo 的全局符号

标准事件修饰符

标准事件还可以具有修饰符,这些修饰符会改变它们的行为。修饰符有:

以下是一个搜索框的示例,它在 input 上搜索,但仅当搜索值发生变化且用户 1 秒内没有输入新内容时:

<input name="q"
       hx-get="/search" hx-trigger="input changed delay:1s"
       hx-target="#search-results"/>

来自 /search URL 的响应将被追加到具有 id search-resultsdiv 中。

非标准事件

htmx 支持一些额外的非标准事件:

通过 HX-Trigger 头触发

如果您试图从 HX-Trigger 响应头触发事件,您很可能希望使用 from:body 修饰符。例如,如果您发送像这样的头 HX-Trigger: my-custom-event 与响应,一个元素可能需要像这样:

  <div hx-get="/example" hx-trigger="my-custom-event from:body">
    Triggered by HX-Trigger header...
  </div>

才能触发。

这是因为该头很可能将在与您希望触发的元素不同的 DOM 层次结构中触发事件。出于类似原因,您通常会从 body 监听热键。

轮询

通过使用语法 every <timing declaration>,您可以让元素定期轮询:

<div hx-get="/latest_updates" hx-trigger="every 1s">
  Nothing Yet!
</div>

此示例将每秒向 /latest_updates URL 发出一次 GET,并将结果交换到此 div 的 innerHTML 中。

如果您想为轮询添加过滤器,它应该在轮询声明 之后 添加:

<div hx-get="/latest_updates" hx-trigger="every 1s [someConditional]">
  Nothing Yet!
</div>

多个触发器

可以提供多个触发器,用逗号分隔。每个触发器都有自己的选项。

  <div hx-get="/news" hx-trigger="load, click delay:1s"></div>

此示例将在页面加载时立即加载 /news,然后在每次点击后延迟 1 秒再次加载。

通过 JavaScript

AJAX 请求也可以通过 JavaScript htmx.trigger() 触发。

注意事项