⚡ 触发器
hx-trigger 属性控制何时发起请求:
标准事件
html
<!-- 点击(默认)-->
<button hx-get="/data" hx-trigger="click">点击</button>
<!-- 加载时 -->
<div hx-get="/data" hx-trigger="load"></div>
<!-- 输入时 -->
<input hx-get="/search" hx-trigger="input">
<!-- 变化时 -->
<select hx-get="/filter" hx-trigger="change">
<!-- 提交时 -->
<form hx-post="/submit" hx-trigger="submit">
特殊触发器
| 触发器 | 说明 |
|---|---|
| load | 元素加载时 |
| revealed | 元素进入视口时 |
| intersect | 元素与视口相交时 |
| every 1s | 定时触发 |
🔧 修饰符
html
<!-- 延迟 -->
<input hx-get="/search" hx-trigger="input delay:500ms">
<!-- 防抖 -->
<input hx-get="/search" hx-trigger="input throttle:1s">
<!-- 只触发一次 -->
<div hx-get="/init" hx-trigger="load once"></div>
<!-- 条件 -->
<button hx-get="/data" hx-trigger="click[confirm('确定?')]">
删除
</button>
<!-- 来自其他元素 -->
<div hx-get="/data" hx-trigger="click from:#btn"></div>
<button id="btn">触发</button>
📡 HTMX 事件
| 事件 | 说明 |
|---|---|
| htmx:abort | 中止请求 |
| htmx:afterOnLoad | 请求完成后 |
| htmx:afterProcessNode | 元素处理后 |
| htmx:afterRequest | 请求后 |
| htmx:afterSettle | DOM 稳定后 |
| htmx:afterSwap | DOM 交换后 |
| htmx:beforeOnLoad | 响应加载前 |
| htmx:beforeRequest | 请求前 |
| htmx:beforeSwap | DOM 交换前 |
| htmx:beforeSend | 发送前 |
| htmx:configRequest | 配置请求 |
| htmx:historyCacheError | 历史缓存错误 |
| htmx:beforeHistoryUpdate | 历史更新前 |
| htmx:load | 元素加载 |
| htmx:noSSESourceError | SSE 错误 |
| htmx:onLoadError | 加载错误 |
| htmx:oobAfterSwap | OOB 交换后 |
| htmx:oobBeforeSwap | OOB 交换前 |
| htmx:oobErrorNoTarget | OOB 目标错误 |
| htmx:prompt | 提示 |
| htmx:pushedIntoHistory | 推入历史 |
| htmx:responseError | 响应错误 |
| htmx:sendAbort | 发送中止 |
| htmx:sseError | SSE 错误 |
| htmx:stalled | 请求停滞 |
| htmx:timeout | 超时 |
| htmx:trigger | 触发请求 |
| htmx:validate | 验证 |
| htmx:validation:halted | 验证失败 |
🎧 监听事件
javascript
// 监听请求完成
document.body.addEventListener('htmx:afterRequest', function(evt) {
console.log('请求完成', evt.detail.pathInfo.requestPath);
});
// 监听错误
document.body.addEventListener('htmx:responseError', function(evt) {
console.error('请求失败', evt.detail.error);
});
// 使用 hx-on 内联监听
<div hx-get="/data"
hx-on:htmx:after-request="console.log('完成')">
</div>