事件 - htmx:sendAbort

htmx:sendAbort 是 HTMX 中的一个事件,在一个请求即将被取消或被替代时触发。这通常发生在:

  • 用户点击某个链接或按钮,触发新的请求,而之前的请求还未完成

  • HTMX 因内部逻辑取消了某个即将发送的请求(如快速点击多次)

事件参数

  • detail.xhr - XMLHttpRequest
  • detail.elt - 触发请求的元素
  • detail.target - 请求的目标
  • detail.requestConfig - AJAX请求的配置

常见触发场景

场景 示例描述
用户连续点击按钮 多次点击提交按钮,旧请求被取消
同一个元素快速多次触发请求 比如 hx-trigger="keyup changed delay:200ms",键盘快速输入会取消旧请求
hx-get/hx-post 在短时间内被替换 新请求会中止旧请求,触发 htmx:sendAbort
手动调用 htmx.abort() 编程方式终止请求

示例代码

<button 
  hx-get="/search"
  hx-trigger="click"
  hx-target="#result"
  id="btn">
  点击请求
</button>

<div id="result">结果区域</div>

<script>
  document.body.addEventListener("htmx:sendAbort", function(evt) {
    console.warn("请求被中止:", evt.detail);
    document.querySelector("#result").innerText = "上一个请求已被取消。";
  });
</script>

使用场景

目标 如何使用 htmx:sendAbort
显示“请求取消”的 UI 提示 在请求取消时弹出提示
调试请求被抢占的原因 控制台记录取消请求
自动清理动画、加载状态 在请求被取消时终止加载动画
替代内容回退逻辑 提供保底内容(如重试按钮)

防止多次点击提交示例

<form hx-post="/submit" hx-target="#form-status" id="myform">
  <input name="email" required>
  <button type="submit" id="submit-btn">提交</button>
</form>

<div id="form-status"></div>

<script>
  const btn = document.getElementById("submit-btn");

  document.body.addEventListener("htmx:send", () => {
    btn.disabled = true;
  });

  document.body.addEventListener("htmx:afterOnLoad", () => {
    btn.disabled = false;
  });

  document.body.addEventListener("htmx:sendAbort", () => {
    btn.disabled = false;
    console.warn("请求取消,表单已解锁");
  });
</script>