hx-trigger

hx-trigger属性允许你指定触发 AJAX 请求的行为。触发器的值可以是以下之一:

  • 事件名称(例如“click”或“my-custom-event”)后跟事件过滤器和一组事件修饰符
  • 定时,定义方式: every <timing declaration>
  • 此类事件的列表(逗号分隔)

标准事件

标准事件 (例如 click, keydown, mouseup, load)。 可以像这样指定为触发器:

<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 的修饰符。

标准事件修饰符

标准事件也可以具有改变其行为方式的修饰符。修饰符包括:

  • once - 该事件只会触发一次(例如第一次点击)
  • changed - 仅当元素的值发生变化时,事件才会改变。请注意 change 是事件的名称,changed 是修饰符的名称。
  • delay: <timing declaration> - 事件触发请求之前会发生延迟。如果再次看到该事件,它将重置延迟。
  • throttle: <timing declaration> - 事件触发请求后将发生节流。如果在延迟完成之前再次看到该事件,则该事件将被忽略,元素将在延迟结束时触发。
  • from: <Extended CSS selector> - 允许触发请求的事件来自文档中的另一个元素(例如,监听主体上的按键事件,以支持热键)

    • 标准 CSS 选择器会解析与该选择器匹配的所有元素。因此,from:input会监听页面上的每个输入。
    • CSS 选择器仅评估一次,页面更改时不会重新评估。如果你需要检测动态添加的元素,请使用标准事件过滤器,例如 hx-trigger="click[event.target.matches('button')] from:body",它可以捕获页面上每个按钮的点击事件。
    • 此处扩展的 CSS 选择器允许使用以下非标准 CSS 值:
    • document - 监听文档上的事件
    • window - 监听窗口上的事件
    • closest <CSS selector> - 查找与给定的 CSS 选择器匹配的最近的父元素或其本身
    • find <CSS selector> - 查找与给定 CSS 选择器最接近的子项
    • next 解析为 element.nextElementSibling
    • next <CSS selector> 向前扫描 DOM 以查找与给定 CSS 选择器匹配的第一个元素。(例如,next .error 将定位到具有 error 类的最近的同级元素)
    • previous 解析为element.previousElementSibling
    • previous <CSS selector> 向后扫描 DOM 以查找与给定 CSS 选择器匹配的第一个元素。(例如,previous .error 将以 error 类为目标,找到最近的前一个兄弟元素)
  • target:<CSS selector> - 允许你通过 CSS 选择器对事件目标进行过滤。当你想要侦听在初始化时可能不在 DOM 中的元素的触发器时,这可能很有用,例如,通过使用子元素的目标过滤器侦听 body

  • consume- 如果包含此选项,则事件将不会触发对父级(或在父级上监听的元素)的任何其他 htmx 请求
  • queue:<queue option> - 确定当一个事件发生时另一个事件的请求正在进行时,事件如何排队。选项包括:
  • first - 将第一个事件加入队列
  • last - 将最后一个事件排入队列(默认)
  • all - 对所有事件进行排队(为每个事件发出请求)
  • none - 不排队新事件

下面是一个搜索框的示例,但仅当搜索值发生变化并且用户 1 秒内没有输入任何新内容时才会进行搜索:

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

来自 url /search 的响应将附加到指定 id 为 search-results 的 div 中。

非标准事件

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

  • load - 加载时触发(对于延迟加载某些内容很有用)
  • revealed - 当元素滚动到视口中时触发(对于延迟加载也很有用)。如果你 在 css 中使用 overflow ,比如:overflow-y: scroll 则应使用 intersect once 而不是 revealed 。
  • intersect - 当元素首次与视口相交时触发一次。这支持两个附加选项:
  • root:<selector> - 用于交集的根元素的 CSS 选择器
  • threshold:<float> - 0.0 至 1.0 之间的浮点数,表示触发事件的交集量

HX-Trigger通过HTTP头触发

如果你尝试从 HX-Trigger 响应头触发事件,则可能需要使用from:body修饰符。例如,如果你在响应中发送这样的HTTP头HX-Trigger: my-custom-event ,则元素可能需要如下所示:

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

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

轮询

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

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

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

如果要为轮询添加过滤器,则应在轮询声明后添加:

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

多个触发器

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

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

通过 JavaScript

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

笔记

  • hx-trigger 不会被继承
  • hx-trigger 可以在没有 AJAX 请求的情况下使用,在这种情况下它只会触发htmx:trigger事件
  • 为了将包含空格的 CSS 选择器(例如form input)传递给 from- 或 target- 修饰符,请将选择器括在括号或花括号中(例如from:(form input)或from:closest (form input))