hx-trigger

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

标准事件

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

可以像这样指定标准事件(如click)作为触发器:

<div hx-get="/clicked" hx-trigger="click">点击我</div>

标准事件过滤器

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

<div hx-get="/clicked" hx-trigger="click[ctrlKey]">Ctrl+点击我</div>

当点击事件的event.ctrlKey属性为true时触发此事件。

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

<div hx-get="/clicked" hx-trigger="click[checkGlobalState()]">检查全局状态后点击我</div>

也可以使用标准JavaScript语法组合条件

<div hx-get="/clicked" hx-trigger="click[ctrlKey&&shiftKey]">Ctrl+Shift+点击我</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">
    由HX-Trigger头触发...
  </div>

才能触发。

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

轮询

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

<div hx-get="/latest_updates" hx-trigger="every 1s">
  暂无更新!
</div>

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

如果要对轮询添加过滤器,应将其添加在轮询声明之后:

<div hx-get="/latest_updates" hx-trigger="every 1s [someConditional]">
  暂无更新!
</div>

多个触发器

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

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

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

通过JavaScript

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

注意