</> htmx 备忘清单

htmx 是一个面向浏览器、无运行时依赖的 JavaScript 库。它通过 hx-* HTML 属性让页面直接发起 AJAX 请求、局部替换 HTML、处理 CSS 过渡,并通过扩展支持 WebSocket、SSE 等能力。

入门

安装

:----
下载文件下载 htmx.min.js 后用普通 <script> 引入
npmnpm install htmx.org@2.0.10
Webpack / bundlerimport "htmx.org";
全局变量window.htmx = require("htmx.org");
扩展先加载 htmx,再加载扩展并使用 hx-ext

htmx 2.x 是当前主线;1.x 仍支持 IE11。生产环境使用 CDN 时建议固定版本,并按官方下载页更新 integrity 值。

<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.10/dist/htmx.min.js"></script>

第一个请求

<button hx-post="/clicked" hx-swap="outerHTML">
  点击我
</button>

当按钮被点击时,htmx 会向 /clicked 发出 POST 请求,并用响应 HTML 替换整个按钮。

AJAX 方法

:----
hx-get="/url"发起 GET 请求
hx-post="/url"发起 POST 请求
hx-put="/url"发起 PUT 请求
hx-patch="/url"发起 PATCH 请求
hx-delete="/url"发起 DELETE 请求

默认触发事件按元素类型决定:inputtextareaselectchangeformsubmit,其他元素为 click

请求与交换

hx-trigger

:----
hx-trigger="click"点击时触发
hx-trigger="mouseenter"鼠标进入时触发
hx-trigger="load"元素加载后触发
hx-trigger="every 2s"每 2 秒轮询
hx-trigger="keyup changed delay:500ms"值变化且停止输入 500ms 后触发
hx-trigger="click once"只触发一次
hx-trigger="click[ctrlKey]"满足事件过滤表达式才触发
hx-trigger="load, click delay:1s"多个触发器组合

常用修饰符:

  • once:只触发一次
  • changed:值变化时才触发
  • delay:<time>:延迟触发,期间再次触发会重置计时
  • throttle:<time>:节流触发
  • from:<selector>:监听其他元素上的事件
  • target:<selector>:只处理来自匹配目标的事件

hx-target

:----
hx-target="#result"将响应换入指定元素
hx-target="this"目标为当前元素
hx-target="closest tr"目标为最近的表格行
hx-target="next .panel"目标为后续匹配元素
hx-target="previous .item"目标为前一个匹配元素
hx-target="find .body"目标为当前元素内的匹配子元素

示例

<input
  name="q"
  hx-get="/search"
  hx-trigger="keyup changed delay:500ms"
  hx-target="#search-results"
  placeholder="搜索">
<div id="search-results"></div>

hx-swap

:----
innerHTML默认,替换目标元素内部 HTML
outerHTML替换整个目标元素
beforebegin插入到目标元素之前
afterbegin插入到目标元素内部开头
beforeend插入到目标元素内部结尾
afterend插入到目标元素之后
delete删除目标元素
none不换入主体内容,仍处理带外交换

常用修饰符:

:----
swap:1s收到响应后延迟 1 秒再交换
settle:500ms交换后等待 500ms 再 settle
transition:true使用 View Transitions API
ignoreTitle:true忽略响应中的 <title>
scroll:bottom交换后滚动到底部
show:top交换后显示目标顶部

选择与带外交换

:----
hx-select="#content"从响应中选择局部内容换入
hx-select-oob="#alert"从响应中挑选带外内容
hx-swap-oob="true"响应片段按 id 直接更新页面其他位置
hx-preserve在交换中保留元素

表格中的 trtd 等片段用于带外交换时,建议用 <template> 包裹,避免浏览器解析 HTML 时丢失结构。

参数与表单

参数提交

:----
普通输入元素如果元素有 name 和值,会随请求提交
form提交表单内所有输入值
GET 请求会包含关联表单的输入值
hx-include="#extra"额外包含其他元素的值
hx-params="not csrf"过滤请求参数
hx-vals='{"page": 1}'添加 JSON 格式的额外值
htmx:configRequest发请求前用事件修改参数或请求头

文件上传

<form
  hx-post="/upload"
  hx-encoding="multipart/form-data"
  hx-target="#result">
  <input type="file" name="file">
  <button>上传</button>
</form>
<progress id="progress" value="0" max="100"></progress>
<div id="result"></div>

上传时可监听 htmx:xhr:progress 显示进度。

确认与提示

:----
hx-confirm="确定删除?"请求前显示确认框
hx-prompt="请输入名称"请求前显示提示框
htmx:confirm自定义异步确认流程
HX-Prompt请求头中包含用户对 prompt 的响应

常见模式

点击编辑

<div hx-target="this" hx-swap="outerHTML">
  <div><label>名字</label>: Joe</div>
  <div><label>邮箱</label>: joe@example.com</div>
  <button hx-get="/contacts/1/edit">编辑</button>
</div>

服务器返回表单:

<form hx-put="/contacts/1" hx-target="this" hx-swap="outerHTML">
  <input name="firstName" value="Joe">
  <input name="email" value="joe@example.com">
  <button>保存</button>
  <button hx-get="/contacts/1">取消</button>
</form>

删除行

<tbody hx-confirm="确定删除?" hx-target="closest tr" hx-swap="outerHTML swap:1s">
  <tr>
    <td>Joe</td>
    <td>joe@example.com</td>
    <td><button hx-delete="/contacts/1">删除</button></td>
  </tr>
</tbody>

tr.htmx-swapping td {
  opacity: 0;
  transition: opacity 1s ease-out;
}

延迟加载与轮询

<div hx-get="/graph" hx-trigger="load">
  <img class="htmx-indicator" src="/spinner.svg" alt="加载中">
</div>

<div hx-get="/news" hx-trigger="every 2s"></div>

服务器可返回 HTTP 286 来停止轮询。

请求指示器

<button hx-get="/save" hx-indicator="#indicator">
  保存
</button>
<img id="indicator" class="htmx-indicator" src="/spinner.svg" alt="加载中">

请求期间 htmx 会添加 htmx-request 类,默认会让 .htmx-indicator 显示出来。

API 参考

核心属性

属性说明
hx-boost增强链接和表单,使用 AJAX 替代整页跳转
hx-get发起 GET 请求
hx-post发起 POST 请求
hx-put发起 PUT 请求
hx-patch发起 PATCH 请求
hx-delete发起 DELETE 请求
hx-trigger指定触发请求的事件
hx-target指定响应内容换入的目标
hx-swap指定内容交换方式
hx-select从响应中选择要换入的内容
hx-push-url将 URL 推入浏览器历史
hx-replace-url替换当前浏览器 URL
hx-swap-oob处理响应中的带外交换

附加属性

属性说明
hx-confirm请求前显示确认对话框
hx-disabled-elt请求期间禁用触发元素或指定元素
hx-disable禁用当前节点及子节点的 htmx 处理
hx-disinherit禁用属性继承
hx-encoding设置请求编码,如 multipart/form-data
hx-ext启用扩展
hx-headers添加请求头
hx-history-elt指定历史快照元素
hx-include包含额外输入值
hx-indicator指定请求期间显示状态的元素
hx-params过滤请求参数
hx-preserve交换时保留元素
hx-prompt请求前显示提示框
hx-request配置请求行为
hx-select-oob从响应中选择带外交换内容
hx-sync控制多个请求之间的同步
hx-validate请求前触发表单验证
hx-vals添加 JSON 格式参数

CSS 类

Class说明
htmx-added新内容换入前添加,settle 后移除
htmx-indicator请求指示器元素,默认隐藏
htmx-request请求期间添加到触发元素或指示器元素
htmx-settling内容交换后、settle 前添加
htmx-swappingswap 前添加,可用于离场动画

常用事件

事件说明
htmx:beforeRequest发出请求前触发
htmx:configRequest请求前配置参数和请求头
htmx:beforeSendXHR 发送前触发
htmx:afterRequest请求完成后触发
htmx:beforeSwap交换前触发,可改变目标或 swap 方式
htmx:afterSwap内容换入后触发
htmx:afterSettleDOM settle 后触发
htmx:load新内容加入 DOM 后触发
htmx:confirm请求确认阶段触发
htmx:responseErrorHTTP 错误响应时触发
htmx:sendError网络发送失败时触发
htmx:timeout请求超时时触发
htmx:xhr:progressXHR 进度事件,常用于上传

JavaScript API

方法说明
htmx.ajax()发起 htmx 风格 AJAX 请求
htmx.trigger()触发元素事件
htmx.on()添加事件监听器
htmx.off()移除事件监听器
htmx.onLoad()监听 htmx 加载的新内容
htmx.process()处理动态加入的 DOM
htmx.find()查找单个元素
htmx.findAll()查找多个元素
htmx.closest()查找最近祖先元素
htmx.addClass()添加类
htmx.removeClass()移除类
htmx.toggleClass()切换类
htmx.takeClass()从同级元素中取得唯一类
htmx.logAll()打开所有 htmx 事件日志
htmx.logger自定义日志函数

请求头

标头说明
HX-Boosted请求来自 hx-boost
HX-Current-URL当前浏览器 URL
HX-History-Restore-Request历史恢复请求
HX-Prompt用户对 hx-prompt 的响应
HX-Requesthtmx 请求总是为 true
HX-Target目标元素 id
HX-Trigger-Name触发元素 name
HX-Trigger触发元素 id

响应头

标头说明
HX-Location客户端跳转但不整页刷新
HX-Push-Url推入新的浏览器历史 URL
HX-Redirect浏览器重定向到新地址
HX-Refresh值为 true 时刷新整页
HX-Replace-Url替换当前浏览器 URL
HX-Reswap覆盖客户端 hx-swap
HX-Retarget覆盖客户端目标元素
HX-Reselect覆盖客户端 hx-select
HX-Trigger响应收到后触发事件
HX-Trigger-After-Swapswap 后触发事件
HX-Trigger-After-Settlesettle 后触发事件

扩展与调试

扩展

:----
hx-ext="response-targets"按 HTTP 状态码选择目标
hx-ext="sse"Server-Sent Events 支持
hx-ext="ws"WebSocket 支持
hx-ext="preload"预加载内容
hx-ext="head-support"合并响应中的 head 信息
hx-ext="htmx-1-compat"恢复部分 htmx 1.x 行为

扩展必须在核心 htmx 之后加载,社区扩展可能有不同安装方式,使用前应查看对应扩展仓库。

调试

:----
htmx.logAll()在控制台记录所有 htmx 事件
htmx.logger = fn自定义日志输出
HX-Request: true服务端识别 htmx 请求
Network 面板查看 HX-* 请求头和响应头
htmx:beforeSwap调试目标、响应和交换行为
htmx:responseError处理非 2xx/3xx 响应

全局配置

<meta name="htmx-config" content='{"defaultSwapStyle":"outerHTML"}'>

也可以直接修改 htmx.config。常见配置包括默认 swap 样式、请求超时、是否允许属性继承、是否携带跨站凭据等。