事件 - htmx:beforeHistorySave

htmx:beforeHistorySave 是 HTMX 在即将把当前页面状态保存到浏览器历史记录中时触发的事件。

你可以在这个事件中:

  • 修改即将保存的历史状态(如 DOM 快照或 URL)

  • 添加自定义状态字段(如当前页签、滚动位置)

  • 控制保存行为(如阻止某些页面被保存)

它通常配合 hx-push-url="true" 或 hx-history="true" 使用。

触发时机

  • HTMX 准备调用 history.pushState() 或 history.replaceState() 之前

  • 页面内容更新后,但在历史记录实际更新前

事件参数

  • detail.path - 正在恢复的页面的路径和查询
  • detail.historyElt - 历史被恢复到的元素
  • detail.configEventSource - 将传递给构造函数的配置

示例:记录滚动位置到历史记录

<a hx-get="/page1" hx-target="#main" hx-push-url="true">加载 Page 1</a>
<a hx-get="/page2" hx-target="#main" hx-push-url="true">加载 Page 2</a>

<div id="main" style="height: 200px; overflow: auto;">
  <!-- 可滚动内容区域 -->
</div>

<script>
  document.body.addEventListener("htmx:beforeHistorySave", function (event) {
    const scrollTop = document.querySelector("#main").scrollTop;

    // 将滚动位置写入 history state
    event.detail.history.scrollTop = scrollTop;
    console.log("将滚动位置保存进历史记录:", scrollTop);
  });

  // 当恢复历史状态时还原滚动位置
  document.body.addEventListener("htmx:historyRestore", function (event) {
    const scrollTop = event.detail.cache?.scrollTop || 0;
    document.querySelector("#main").scrollTop = scrollTop;
    console.log("从历史中恢复 scrollTop:", scrollTop);
  });
</script>

使用场景

用途 示例
保存滚动位置 上述示例所示
保存分页状态 如表格当前第几页、第几行
保存筛选条件 搜索框、过滤选项的状态
自定义标签页标识 例如某个 tab 被选中时记录 tab ID
修改 path 修改 URL 中的查询参数或 hash 部分