HTMX - AJAX
HTMX 的主要目的是直接從 HTML 傳送 AJAX 請求,無需使用 JavaScript,這可以透過 HTMX 屬性實現。當觸發特定事件時,以下列出的屬性之一將向給定的 URL 發起 AJAX 請求。
HTMX 屬性
下面列出了最常用的屬性,這些屬性用於直接從 HTML 傳送 AJAX 請求。每個屬性都接收一個 URL 來發出 AJAX 請求。
- hx-get: 此屬性對給定的 URL 執行 GET 請求。
- hx-post: 此屬性對給定的 URL 執行 POST 請求。
- hx-put: 此屬性對給定的 URL 執行 PUT 請求。
- hx-patch: 此屬性對給定的 URL 執行 PATCH 請求。
- hx-delete: 此屬性對給定的 URL 執行 DELETE 請求。
HTMX 中 AJAX 請求的示例
當元素被觸發時,該元素將向給定的 URL 發出指定型別的請求。
觸發請求
AJAX 請求由自然事件觸發,例如元素上的滑鼠移入或移出。像輸入框、文字區域和選擇框在更改事件時觸發。表單在提交事件時觸發,其他元素在點選事件時觸發。要自定義這些行為,可以使用 hx-trigger 屬性指定哪個事件將是請求的原因。
<div hx-post="/mouse_leave" hx-trigger="mouseleave"> [Here Mouse, Mouse!] </div>
觸發器修飾符:如果希望請求只觸發一次,可以修改行為,只需為觸發器新增 once 關鍵字。您可以檢視下面列出的修飾符。
- once: 僅觸發一次請求。
- changed: 如果元素的值已更改,則觸發請求。
- delay:<時間間隔>: 在給定時間後觸發請求,如果再次觸發,則倒計時將從頭開始。
- throttle:<時間間隔>: 與延遲相同,但如果事件在限制結束前發生,則該事件將被丟棄。因此,請求將在時間結束時觸發。
- from:<CSS 選擇器>: 等待不同元素的事件。這可用於在鍵盤快捷鍵上觸發請求。
<div hx-post="/mouse_leave" hx-trigger="mouseleave once"> [Here Mouse, Mouse!] </div>
觸發器過濾器:您可以應用觸發器過濾器來觸發請求。為此,您可以在事件名稱後使用方括號 ([])。以下示例僅在元素的 Control-Click 上觸發。
<div hx-get="/clicked" hx-trigger="click[ctrlKey]"> Control Click </div>
特殊事件:有一些特殊事件可用於 hx-trigger 屬性。
- load: 元素首次載入時觸發。
- revealed: 元素首次滾動到視口時觸發。
- intersect: 元素首次與視口相交時觸發。這支援兩個附加選項
- root:<選擇器>: 交叉點的根元素的 CSS 選擇器。
- threshold:<浮點數>: 0.0 到 1.0 表示觸發事件所需的交叉量。
如果您有高階用例,還可以使用自定義事件來觸發請求。
輪詢:當您希望元素不等待事件時,可以透過使用 every 作為 hx-trigger 屬性的值,在元素上設定輪詢。
如下面的虛擬碼所示,它每 2 秒發出一次對 /content 的 GET 請求,並將響應載入到 div 元素中。
<div hx-get="/content" hx-trigger="every 2s"></div>
載入輪詢:還有另一種輪詢,即載入輪詢,其中元素指定一個帶有指定時間延遲的 load 觸發器,並用響應替換自身。
<div hx-get="/messages" hx-trigger="load delay:1s" hx-swap="outerHTML" > </div>
請求指示器
發出 AJAX 請求時,您需要通知使用者請求已啟動。您可以對子元素使用 htmx-indicator 類,如下面的虛擬碼所示。
<button hx-get="/click">
Click Me!
<img class="htmx-indicator" src="/spinner.gif">
</button>
在此程式碼中,我們有一個按鈕,當單擊該按鈕時,將觸發 GET 請求,並且此時將彈出一個載入動畫,向用戶顯示 AJAX 請求已啟動。
目標
您可以使用 hx-target 屬性設定要載入請求響應的元素。在此程式碼中,您可以看到請求的響應將呈現到 div#search-results 元素上。
<input type="text" name="q" hx-get="/trigger_delay" hx-trigger="keyup delay:500ms" hx-target="#search-results" > <div id="search-results"></div>
交換
內容替換目標元素的 innerHTML。您可以使用 hx-swap 屬性修改此行為。有一些預定義的值,例如 innerHTML、outerHTML、afterbegin 等值。
- 變形交換:變形交換嘗試將新內容合併到現有 DOM 中。
- 檢視過渡:檢視過渡 API 允許開發人員在不同的 DOM 狀態之間建立動畫過渡,但目前並非所有瀏覽器都支援它。
- 交換選項:當您使用 hx-swap 屬性時,交換中有一些特定的選項。
交換修飾符出現在指定交換樣式之後,並用冒號分隔。
同步
透過使用 hx-sync 屬性在兩個元素之間執行同步。當您希望來自一個元素的請求取代另一個元素的請求,或等待另一個元素的請求完成時,這將是必需的。
CSS 過渡
HTMX 支援無需使用 JavaScript 即可進行過渡,這是 HTMX 最好的特性之一。
<div id="div1">Original Content</div> <div id="div1" class="red">New Content</div>
.red {
color: red;
transition: all ease-in 1s ;
}
兩個 div 具有相同的 id 和第二個元素上的紅色類,因此當 HTMX 交換此新內容時,定義的 CSS 將應用於新內容。
帶外交換
如果要將響應中的內容直接交換到 DOM 中,可以使用 hx-swap-oob 屬性,其值為 true。
<div id="message" hx-swap-oob="true">Swap me directly!</div>
引數
對於觸發 AJAX 請求的元素,引數是必需的。導致請求的元素將包含其值(如果存在)。如果元素是表單,它將包含其中所有輸入的值。
- 檔案上傳:如果要透過 htmx 請求上傳檔案,可以將 hx-encoding 屬性設定為 multipart/form-data。
- 額外值:可以透過使用 hx-values 屬性新增額外值。
確認請求
在觸發和請求之前,最好確認請求,為此可以使用 hx-confirm 屬性。這允許您使用簡單的 javascript 對話方塊確認操作。
<button hx-delete="/account" hx-confirm="Are you sure?"> Delete My Account </button>