hx-trigger

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

标准事件

标准事件(如 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 的全局符号

标准事件修饰符

标准事件还可以具有更改其行为方式的修饰符。修饰符是

以下是一个搜索框的示例,该搜索框在 keyup 上搜索,但只有在搜索值发生更改且用户在 1 秒内没有输入任何内容的情况下才会搜索

<input name="q"
       hx-get="/search" hx-trigger="keyup 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 层次结构中触发事件。出于类似的原因,您通常会从主体监听热键。

轮询

通过使用 every <时间声明> 语法,您可以让元素定期轮询

<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,然后在每次点击后延迟一秒再次加载。

通过 JavaScript

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

注意事项