Htmx 提供了一个广泛的事件系统,可用于修改和增强行为。事件 列在下面。
htmx:abort此事件与其他事件不同:htmx 不会 触发 它,而是 监听 它。
如果您向正在发出请求的元素发送 htmx:abort 事件,它将中止该请求:
<button id="request-button" hx-post="/example">Issue Request</button>
<button onclick="htmx.trigger('#request-button', 'htmx:abort')">Cancel Request</button>
htmx:afterOnLoad此事件在 AJAX onload 完成后触发。请注意,这并不意味着内容
已被交换或已稳定,仅表示请求已完成。
detail.elt - 发出请求的元素,如果 body 不再包含该元素,则为最近的父元素detail.xhr - 该 XMLHttpRequestdetail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:afterProcessNode此事件在 htmx 初始化 DOM 节点后触发。它可用于扩展来为节点构建附加功能。
detail.elt - 正在初始化的元素htmx:afterRequest此事件在 AJAX 请求完成时触发,无论是在成功请求的情况下(尽管
可能返回了远程错误代码,如 404),还是在网络错误情况下。此事件
可与 htmx:beforeRequest 配对,以围绕请求周期包装行为。
detail.elt - 发出请求的元素,如果 body 不再包含该元素,则为最近的父元素detail.xhr - 该 XMLHttpRequestdetail.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 已 settled 后触发。
detail.elt - 更新后的元素detail.xhr - 该 XMLHttpRequestdetail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:afterSwap此事件在将新内容 交换到 DOM 后触发。
detail.elt - 交换进来的元素detail.xhr - 该 XMLHttpRequestdetail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:beforeCleanupElement此事件在 htmx 禁用 元素或将其从 DOM 中移除之前触发。
detail.elt - 要清理的元素htmx:beforeOnLoad此事件在任何响应处理发生之前触发。如果您在事件上调用 preventDefault() 以取消它,则不会发生交换。
detail.elt - 发出请求的元素detail.xhr - 该 XMLHttpRequestdetail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:beforeProcessNode此事件在 htmx 初始化 DOM 节点并处理其所有 hx- 属性之前触发。这使得扩展和其他外部代码能够在节点处理之前修改 DOM 节点的内容。
detail.elt - 正在初始化的元素htmx:beforeRequest此事件在发出 AJAX 请求之前触发。如果您在事件上调用 preventDefault() 以取消它,则不会发生请求。
detail.elt - 发出请求的元素detail.xhr - 该 XMLHttpRequestdetail.target - 请求的目标detail.boosted - 如果请求是通过使用 boosting 的元素发出的,则为 truedetail.requestConfig - AJAX 请求的配置htmx:beforeSend此事件在发送请求之前立即触发。您不能使用此事件取消请求。
detail.elt - 发出请求的元素detail.xhr - 该 XMLHttpRequestdetail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:beforeSwap此事件在将任何新内容 交换到 DOM 之前触发。
detail 上的大多数值都可以设置以覆盖后续行为,除了响应头优先的情况下。
如果您在事件上调用 preventDefault() 以取消它,则不会发生交换。
您可以通过修改事件详情的 shouldSwap、selectOverride、swapOverride 和 target 属性来修改默认交换行为。
有关更多详细信息,请参阅 配置交换 的文档。
detail.elt - 交换的目标detail.xhr - 该 XMLHttpRequestdetail.boosted - 如果请求是通过使用 boosting 的元素发出的,则为 truedetail.requestConfig - AJAX 请求的配置detail.requestConfig.elt - 发出请求的元素detail.shouldSwap - 如果内容将被交换(对于非 200 响应代码默认为 false)detail.ignoreTitle - 如果为 true,则响应中的任何 title 标签将被忽略detail.isError - 是否应触发错误事件,并确定后续事件中 detail.successful 和 detail.failed 的值detail.serverResponse - 作为交换文本使用的服务器响应detail.selectOverride - 添加此项以代替 hx-select 值detail.swapOverride - 添加此项以代替 hx-swap 值detail.target - 交换的目标htmx:beforeTransition此事件在 View Transition
包装的交换发生之前触发。如果您在事件上调用 preventDefault() 以取消它,则 View Transition 不会发生,而是会发生正常的交换逻辑。
detail.elt - 发出请求的元素detail.xhr - 该 XMLHttpRequestdetail.boosted - 如果请求是通过使用 boosting 的元素发出的,则为 truedetail.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(); // add a new parameter into the mix
});
请注意,如果输入值出现多次,则 parameters 对象中的值将是一个数组,而不是
单个值。
detail.parameters - 将在请求中提交的参数detail.unfilteredParameters - 在通过 hx-params 过滤之前找到的参数detail.headers - 请求头detail.elt - 触发请求的元素detail.target - 请求的目标detail.verb - 使用的 HTTP 动词htmx:confirm此事件在每个请求触发器上触发(不仅仅是具有 hx-confirm 属性的元素)。
它允许您取消(或延迟)发出 AJAX 请求。
如果您在事件上调用 preventDefault(),它将不会发出给定的请求。
detail 对象包含一个函数 evt.detail.issueRequest(skipConfirmation=false),可用于在稍后点发出实际的 AJAX 请求。
结合这两个功能允许您创建异步确认对话框。
以下是一个基本示例,展示 htmx:confirm 事件的基本用法,而不更改默认行为:
document.body.addEventListener('htmx:confirm', function(evt) {
// 0. To modify the behavior only for elements with the hx-confirm attribute,
// check if evt.detail.target.hasAttribute('hx-confirm')
// 1. Prevent the default behavior (this will prevent the request from being issued)
evt.preventDefault();
// 2. Do your own logic here
console.log(evt.detail)
// 3. Manually issue the request when you are ready
evt.detail.issueRequest(); // or evt.detail.issueRequest(true) to skip the built-in window.confirm()
});
以下是一个使用 sweet alert 的示例,在任何具有 confirm-with-sweet-alert="{question}" 属性的元素上:
document.body.addEventListener('htmx:confirm', function(evt) {
// 1. The requirement to show the sweet alert is that the element has a confirm-with-sweet-alert
// attribute on it, if it doesn't we can return early and let the default behavior happen
if (!evt.detail.target.hasAttribute('confirm-with-sweet-alert')) return
// 2. Get the question from the attribute
const question = evt.detail.target.getAttribute('confirm-with-sweet-alert');
// 3. Prevent the default behavior (this will prevent the request from being issued)
evt.preventDefault();
// 4. Show the sweet alert
swal({
title: "Are you sure?",
text: question || "Are you sure you want to continue?",
icon: "warning",
buttons: true,
dangerMode: true,
}).then((confirmed) => {
if (confirmed) {
// 5. If the user confirms, we can manually issue the request
evt.detail.issueRequest(true); // true to skip the built-in window.confirm()
}
});
});
detail.elt - 相关元素detail.etc - 附加请求信息(大多未使用)detail.issueRequest(skipConfirmation=false) - 一个可调用函数,用于发出请求(应与 evt.preventDefault() 配对!),如果 skipConfirmation 为 true,则不执行原始的 window.confirm()detail.path - 请求的路径detail.target - 触发请求的元素detail.triggeringEvent - 触发此请求的原始事件detail.verb - 请求的动词(例如 GET)detail.question - 传递给 hx-confirm 属性的问题(仅在存在 hx-confirm 属性时可用)htmx:historyCacheError此事件在尝试将缓存保存到 localStorage 失败时触发
detail.cause - 尝试保存历史记录到 localStorage 时抛出的 Exceptionhtmx:historyCacheHit此事件在恢复历史记录时发生缓存命中时触发
您可以通过 preventDefault() 防止历史记录恢复,以允许替代恢复处理。
如果需要,您也可以在此事件中覆盖历史记录恢复请求的详情
detail.historyElt - 将被替换的历史元素或 bodydetail.item.content - 将交换进来的缓存内容detail.item.title - 从缓存更新的页面标题detail.path - 正在恢复的页面的路径和查询detail.swapSpec - 要使用的 swapSpec,包含默认 swapStyle=‘innerHTML’htmx:historyCacheMiss此事件在恢复历史记录时发生缓存未命中时触发
您可以通过 preventDefault() 防止历史记录恢复,以允许替代恢复处理。
您也可以在发出恢复历史记录的请求之前修改 xhr 请求或其他详情
detail.historyElt - 将被替换的历史元素或 bodydetail.xhr - 将检索远程内容以进行恢复的 XMLHttpRequestdetail.path - 正在恢复的页面的路径和查询detail.swapSpec - 要使用的 swapSpec,包含默认 swapStyle=‘innerHTML’htmx:historyCacheMissLoadError此事件在发生缓存未命中并从服务器检索到用于恢复的内容响应时触发,
但响应是一个错误(例如 404)
detail.xhr - 该 XMLHttpRequestdetail.path - 正在恢复的页面的路径和查询htmx:historyCacheMissLoad此事件在发生缓存未命中并成功从服务器检索到用于恢复的内容响应时触发
您可以在发出交换以恢复历史记录之前修改详情
detail.historyElt - 将被替换的历史元素或 bodydetail.xhr - 该 XMLHttpRequestdetail.path - 正在恢复的页面的路径和查询detail.response - 将交换进来的响应文本detail.swapSpec - 要使用的 swapSpec,包含默认 swapStyle=‘innerHTML’htmx:historyRestore此事件在 htmx 处理历史记录恢复操作时触发
detail.path - 正在恢复的页面的路径和查询detail.cacheMiss - 如果恢复是缓存未命中,则设置为 truedetail.serverResponse - 缓存未命中时具有替换的响应文本detail.item - 缓存命中时恢复的缓存详情htmx:beforeHistorySave此事件在内容保存到历史缓存之前触发。
您可以修改 historyElt 的内容以移除第三方 JavaScript 更改,从而将干净的内容副本备份到历史缓存
detail.path - 正在保存的页面的路径和查询detail.historyElt - 即将保存的历史元素htmx:load此事件在 htmx 将新节点加载到 DOM 时触发。请注意,当 htmx 首次初始化时,此事件也会触发,目标为文档 body。
detail.elt - 新添加的元素htmx:noSSESourceError此事件在元素在其触发器中引用 SSE 事件但未定义父 SSE 源时触发
detail.elt - 具有错误 SSE 触发器的元素htmx:oobAfterSwap此事件作为 out of band swap 的一部分触发,并与 after swap event 行为相同
detail.elt - 交换进来的元素detail.shouldSwap - 如果内容将被交换(默认为 true)detail.target - 交换的目标detail.fragment - 响应片段htmx:oobBeforeSwap此事件作为 out of band swap 的一部分触发,并与 before swap event 行为相同
detail.elt - 交换的目标detail.shouldSwap - 如果内容将被交换(默认为 true)detail.target - 交换的目标detail.fragment - 响应片段htmx:oobErrorNoTarget此事件在 out of band swap 在 DOM 中没有对应的元素可切换时触发。
detail.content - 具有错误 oob id 的元素htmx:onLoadError此事件在 AJAX 调用处理 load 时发生错误时触发
detail.xhr - 该 XMLHttpRequestdetail.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(push、replace)detail.xhr - 该 XMLHttpRequestdetail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:pushedIntoHistory此事件在将 URL 推入历史记录后触发。
detail.path - 已推入历史记录的 URL 的路径和查询htmx:replacedInHistory此事件在将 URL 替换在历史记录中后触发。
detail.path - 已替换在历史记录中的 URL 的路径和查询htmx:responseError此事件在发生 HTTP 错误响应时触发
detail.xhr - 该 XMLHttpRequestdetail.elt - 触发请求的元素detail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:sendAbort此事件在请求中止时触发
detail.xhr - 该 XMLHttpRequestdetail.elt - 触发请求的元素detail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:sendError此事件在网络错误阻止 HTTP 请求发生时触发
detail.xhr - 该 XMLHttpRequestdetail.elt - 触发请求的元素detail.target - 请求的目标detail.requestConfig - AJAX 请求的配置htmx:sseError此事件在 SSE 源发生错误时触发
detail.elt - 具有错误 SSE 源的元素detail.error - 该错误detail.source - SSE 源htmx:swapError此事件在交换阶段发生错误时触发
detail.xhr - 该 XMLHttpRequestdetail.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 - 该 XMLHttpRequestdetail.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) {
// only allow requests to the current server as well as myserver.com
if (!evt.detail.sameHost && evt.detail.url.hostname !== "myserver.com") {
evt.preventDefault();
}
});
detail.elt - 触发请求的元素detail.url - 表示将发送请求的 URL 的 URL 对象。detail.sameHost - 如果请求与文档相同的宿主,则为 truehtmx:validation:validate此事件在元素验证之前触发。它可以使用 elt.setCustomValidity() 方法
来实现自定义验证规则。
<form hx-post="/test">
<input _="on htmx:validation:validate
if my.value != 'foo'
call me.setCustomValidity('Please enter the value foo')
else
call me.setCustomValidity('')"
name="example">
</form>
detail.elt - 要验证的元素htmx:validation:failed此事件在元素验证失败时触发。如果在事件上调用 preventDefault(),则由 htmx.config.reportValidityOfForms 启用的 reportValidity() 不会被调用。
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 - 触发请求的元素