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>

如果觸發了 click 事件且 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 層次結構中觸發事件。出於類似的原因,您通常會從 body 監聽熱鍵。

輪詢

通過使用語法 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 請求。

注意事項