事件 - htmx:replacedInHistory

htmx:replacedInHistory 是 HTMX 在使用 history.replaceState() 修改浏览器地址栏后触发的事件。

你可以监听这个事件来响应 URL 的替换操作,比如更新 UI 状态、面包屑导航、记录埋点等。

HTMX 中用于改变浏览器地址栏的属性是 hx-push-url:

  • hx-push-url="true" → 使用 pushState(),添加历史记录 → 触发 htmx:pushedIntoHistory

  • hx-push-url="false" → 不改变 URL(默认行为)→ 不触发任何历史事件

  • hx-push-url="replace" → 使用 replaceState() 替换当前记录 → 触发 htmx:replacedInHistory

事件参数

  • detail.path - 历史记录中被替换的 URL 的路径和查询

示例代码

<nav>
  <a href="/dashboard" 
     hx-get="/dashboard" 
     hx-target="#content" 
     hx-push-url="replace">仪表盘(Replace URL)</a>
</nav>

<div id="content">
  <p>点击上方链接加载仪表盘,并替换当前地址栏 URL。</p>
</div>

<script>
  document.body.addEventListener("htmx:replacedInHistory", function(evt) {
    console.log("当前历史记录已被替换为:", window.location.pathname);
    // 可执行:更新 UI、记录分析、刷新导航等
  });
</script>

以上示例代码中,用户点击链接,HTMX 发送 AJAX 请求加载内容。设置了 hx-push-url="replace",HTMX 会执行:history.replaceState(...),浏览器地址栏更新,但不会新增历史记录项。此时触发 htmx:replacedInHistory 事件。

你可以在事件监听器中做 UI 或状态更新。

常见用途

用途 示例
更新地址栏但不增加历史记录 表单验证状态改变时
改变 URL 参数 用于搜索过滤、分页切换
同步 UI 状态 更新导航高亮、状态提示等
与前端路由联动 Vue/React 混合场景中更新地址栏但不跳转

与其他 HTMX 历史事件对比

事件名 说明
htmx:pushedIntoHistory 使用 pushState() 后触发(新增历史项)
htmx:replacedInHistory 使用 replaceState() 后触发(替换当前项)
htmx:historyRestore 浏览器后退/前进时触发