Htmx 提供了一个广泛的事件系统,可以用来修改和增强行为。事件列举如下。
htmx:abort
此事件不同于其他事件:htmx 并不会触发它,而是监听它。
如果你向发起请求的元素发送一个 htmx:abort
事件,它将会中止请求:
<button id="request-button" hx-post="/example">发起请求</button>
<button onclick="htmx.trigger('#request-button', 'htmx:abort')">取消请求</button>
htmx:afterOnLoad
此事件在 AJAX onload
完成后触发。请注意,这并不意味着内容已经交换或稳定,仅表示请求已完成。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:afterProcessNode
此事件在 htmx 初始化 DOM 节点后触发。对于扩展功能在节点上构建其他功能时,它非常有用。
detail.elt
- 发送请求的元素htmx:afterRequest
此事件在 AJAX 请求完成后触发,无论是成功请求(即使返回了一个远程错误代码如 404
)还是网络错误。此事件可以与 htmx:beforeRequest
结合使用来围绕请求周期包装行为。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置detail.successful
- 如果响应的状态码为 20x 或在 htmx:beforeSwap
事件中标记为 detail.isError = false
则为 true,否则为 falsedetail.failed
- 如果响应的状态码不为 20x 或在 htmx:beforeSwap
事件中标记为 detail.isError = true
则为 true,否则为 falsehtmx:afterSettle
此事件在 DOM 稳定 后触发。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:afterSwap
此事件在新内容 交换到 DOM 中 后触发。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:beforeCleanupElement
此事件在 htmx 禁用 元素或将其从 DOM 中移除之前触发。
detail.elt
- 被清理的元素htmx:beforeOnLoad
此事件在任何响应处理发生之前触发。如果事件被取消,则不会发生交换。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:beforeProcessNode
此事件在 htmx 初始化 DOM 节点并处理其所有 hx-
属性之前触发。这使得扩展和其他外部代码能够在节点内容被处理之前修改 DOM 节点的内容。
detail.elt
- 发送请求的元素htmx:beforeRequest
此事件在发出 AJAX 请求之前触发。如果事件被取消,则不会发生请求。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:beforeSend
此事件在请求发送之前触发。你不能使用此事件取消请求。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:beforeSwap
此事件在新内容 交换到 DOM 中 之前触发。如果事件被取消,则不会发生交换。
你可以通过修改事件详情中的 shouldSwap
和 target
属性来修改默认的交换行为。有关更多详细信息,请参阅 配置交换 文档。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.requestConfig
- AJAX 请求的配置detail.shouldSwap
- 内容是否会被交换(对于非 200 响应码,默认为 false
)detail.ignoreTitle
- 如果为 true
,响应中的任何标题标签都将被忽略detail.target
- 交换的目标htmx:beforeTransition
此事件在发生 视图转换 包装的交换之前触发。如果事件被取消,将不会发生视图转换,而是执行正常的交换逻辑。
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.requestConfig
- AJAX 请求的配置detail.shouldSwap
- 内容是否会被交换(对于非 200 响应码,默认为 false
)detail.target
- 交换的目标htmx:configRequest
此事件在 htmx 收集要包含在请求中的参数后触发。它可以用于包含或更新 htmx 将发送的参数:
document.body.addEventListener('htmx:configRequest', function(evt) {
evt.detail.parameters['auth_token'] = getAuthToken(); // 添加一个新参数
});
请注意,如果一个输入值出现多次,parameters
对象中的值将是一个数组,而不是单个值。
detail.parameters
- 将在请求中提交的参数detail.unfilteredParameters
- 在通过 hx-select
过滤之前找到的参数detail.headers
- 请求标头detail.elt
- 触发请求的元素detail.target
- 请求的目标detail.verb
- 使用的 HTTP 动词htmx:confirm
此事件在触发器触发后立即触发。它允许你取消(或延迟)发出 AJAX 请求。如果你在事件上调用 preventDefault()
,则不会发出请求。detail
对象包含一个函数 evt.detail.issueRequest()
,可以用于在稍后发出实际的 AJAX 请求。结合这两个功能,可以创建一个异步确认对话框。
以下是使用 sweet alert 的示例,适用于任何带有 confirm-with-sweet-alert='true'
属性的元素:
document.body.addEventListener('htmx:confirm', function(evt) {
if (evt.target.matches("[confirm-with-sweet-alert='true']")) {
evt.preventDefault();
swal({
title: "你确定吗?",
text: "你真的确定吗?",
icon: "warning",
buttons: true,
dangerMode: true,
}).then((confirmed) => {
if (confirmed) {
evt.detail.issueRequest();
}
});
}
});
{target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest}
detail.elt
- 相关元素detail.etc
- 其他请求信息(大部分未使用)detail.issueRequest
- 可以调用的无参数函数,用于发出请求(应与 evt.preventDefault()
配对使用!)
detail.path
- 请求的路径detail.target
- 请求的目标detail.triggeringEvent
- 触发此请求的原始事件detail.verb
- 请求的动词(例如 GET
)htmx:historyCacheError
此事件在尝试将缓存保存到 localStorage
时失败时触发
detail.cause
- 尝试将历史保存到 localStorage
时抛出的 Exception
htmx:historyCacheMiss
此事件在恢复历史记录时发生缓存未命中时触发
detail.xhr
- 将检索远程内容进行恢复的 XMLHttpRequest
detail.path
- 正在恢复的页面的路径和查询htmx:historyCacheMissError
此事件在缓存未命中时触发,并且从服务器检索到响应以恢复内容,但响应是错误的(例如 404
)
detail.xhr
- XMLHttpRequest
detail.path
- 正在恢复的页面的路径和查询htmx:historyCacheMissLoad
此事件在缓存未命中时触发,并且从服务器成功检索到响应以恢复内容
detail.xhr
- XMLHttpRequest
detail.path
- 正在恢复的页面的路径和查询htmx:historyRestore
此事件在 htmx 处理历史恢复操作时触发
detail.path
- 正在恢复的页面的路径和查询htmx:beforeHistorySave
此事件在内容保存到历史 API 之前触发。
detail.path
- 正在恢复的页面的路径和查询detail.historyElt
- 正在恢复到的历史元素detail.config
- 将传递给 EventSource
构造函数的配置htmx:load
此事件在 htmx 将新节点加载到 DOM 中时触发。
detail.elt
- 新添加的元素htmx:noSSESourceError
当一个元素在其触发器中引用 SSE 事件,但没有定义父 SSE 源时触发此事件
detail.elt
- 拥有错误 SSE 触发器的元素htmx:oobAfterSwap
此事件作为 带外交换 的一部分触发,并且行为与 交换后事件 相同
detail.elt
- 发送请求的元素detail.shouldSwap
- 内容是否会被交换(默认为 true
)detail.target
- 交换的目标detail.fragment
- 响应片段htmx:oobBeforeSwap
此事件作为 带外交换 的一部分触发,并且行为与 交换前事件 相同
detail.elt
- 发送请求的元素detail.shouldSwap
- 内容是否会被交换(默认为 true
)detail.target
- 交换的目标detail.fragment
- 响应片段htmx:oobErrorNoTarget
当 带外交换 没有与 DOM 中的对应元素交换时触发此事件
detail.content
- 具有错误带外 id
的元素htmx:onLoadError
此事件在 AJAX 调用的 load
处理过程中发生错误时触发
detail.xhr
- XMLHttpRequest
detail.elt
- 触发请求的元素detail.target
- 请求的目标detail.exception
- 发生的异常detail.requestConfig
- AJAX 请求的配置htmx:prompt
此事件在使用 hx-prompt
属性向用户显示提示后触发。如果此事件被取消,则不会发生 AJAX 请求。
detail.elt
- 触发请求的元素detail.target
- 请求的目标detail.prompt
- 用户对提示的响应htmx:beforeHistoryUpdate
此事件在执行历史更新之前触发。它可以用于修改用于更新历史记录的 path
或 type
。
detail.history
- 用于更新历史记录的 path
和 type
(推送,替换)detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:pushedIntoHistory
此事件在 URL 推入历史记录后触发。
detail.path
- 推入历史记录的 URL 的路径和查询htmx:replacedInHistory
此事件在 URL 在历史记录中被替换后触发。
detail.path
- 在历史记录中被替换的 URL 的路径和查询htmx:responseError
此事件在发生 HTTP 错误响应时触发
detail.xhr
- XMLHttpRequest
detail.elt
- 触发请求的元素detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:sendError
此事件在网络错误阻止 HTTP 请求发生时触发
detail.xhr
- XMLHttpRequest
detail.elt
- 触发请求的元素detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:sseError
此事件在 SSE 源发生错误时触发
detail.elt
- 拥有错误 SSE 源的元素detail.error
- 错误detail.source
- SSE 源htmx:swapError
此事件在交换阶段发生错误时触发
detail.xhr
- XMLHttpRequest
detail.elt
- 触发请求的元素detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:targetError
此事件在为 hx-target
属性使用错误的选择器时触发(例如没有前缀 #
的元素 ID)
detail.elt
- 触发请求的元素detail.target
- 错误的 CSS 选择器htmx:timeout
此事件在请求超时时触发。这封装了 XMLHttpRequest 的典型 timeout
事件。
超时时间可以使用 htmx.config.timeout
设置,或者每个元素使用 hx-request
设置
detail.elt
- 发送请求的元素detail.xhr
- XMLHttpRequest
detail.target
- 请求的目标detail.requestConfig
- AJAX 请求的配置htmx:trigger
此事件在 AJAX 请求将要发生时触发,即使未指定任何 AJAX 请求。它主要用于允许 hx-trigger
执行客户端脚本;AJAX 请求有更细粒度的可用事件,如 htmx:beforeRequest
或 htmx:afterRequest
。
detail.elt
htmx:validateUrl
此事件在请求发出之前触发,允许你验证 htmx 将要请求的 URL。如果在事件上调用 preventDefault()
,请求将不会发出。
document.body.addEventListener('htmx:validateUrl', function (evt) {
// 仅允许请求当前服务器以及 myserver.com
if (!evt.detail.sameHost && evt.detail.url.hostname !== "myserver.com") {
evt.preventDefault();
}
});
detail.elt
- 触发请求的元素detail.url
- 表示请求将发送到的 URL 的 URL 对象detail.sameHost
- 如果请求是向文档的相同主机发出的,将为 true
htmx:validation:validate
此事件在元素验证之前触发。它可以与 elt.setCustomValidity()
方法一起使用来实现自定义验证规则。
<form hx-post="/test">
<input _="on htmx:validation:validate
if my.value != 'foo'
call me.setCustomValidity('请输入值 foo')
else
call me.setCustomValidity('')"
name="example">
</form>
detail.elt
- 触发请求的元素htmx:validation:failed
此事件在元素验证失败时触发。
detail.elt
- 触发请求的元素detail.message
- 验证错误信息detail.validity
- 验证对象,包含指定验证失败的属性htmx:validation:halted
此事件在请求因验证错误而被停止时触发。
detail.elt
- 触发请求的元素detail.errors
- 包含无效元素及其相关错误的错误对象数组htmx:xhr:abort
此事件在 AJAX 请求中止时触发
detail.elt
- 触发请求的元素htmx:xhr:loadstart
此事件在 AJAX 请求启动时触发
detail.elt
- 触发请求的元素htmx:xhr:loadend
此事件在 AJAX 请求完成时触发
detail.elt
- 触发请求的元素htmx:xhr:progress
此事件在支持进度的 AJAX 请求进行时周期性触发
detail.elt
- 触发请求的元素