适合初学者的综合 htmx 备忘清单
htmx 是 intercooler.js 的继承者
<script
  src="https://unpkg.com/htmx.org@1.8.4"
>
</script>
<!-- 有一个按钮POST,通过AJAX点击 -->
<button
  hx-post="/clicked"
  hx-swap="outerHTML"
>
  点击我
</button>
hx-post 和 hx-swap 属性告诉 htmx:
当用户单击此按钮时,向
/clicked发出AJAX请求,并用响应替换整个按钮
$ npm install htmx.org
安装 htmx 将导入添加到您的 index.js
import 'htmx.org';
有一个按钮,可以从 /contacts/1/edit 获取联系人的编辑 UI
<div hx-target="this" hx-swap="outerHTML">
  <div><label>名字</label>: Joe</div>
  <div><label>姓</label>: Blow</div>
  <div><label>邮箱</label>: joe@blow.com</div>
  <button hx-get="/contact/1/edit" class="btn btn-primary">
    点击编辑
  </button>
</div>
这将返回一个可用于编辑联系人的表单
<form hx-put="/contact/1" hx-target="this" hx-swap="outerHTML">
  <div>
    <label>名字</label>
    <input type="text" name="firstName" value="Joe">
  </div>
  <div class="form-group">
    <label>姓</label>
    <input type="text" name="lastName" value="Blow">
  </div>
  <div class="form-group">
    <label>邮箱</label>
    <input type="email" name="email" value="joe@blow.com">
  </div>
  <button class="btn">提交</button>
  <button class="btn" hx-get="/contact/1">取消</button>
</form> 
表单按照通常的 REST-ful 模式将 PUT 发回 /contacts/1
<table class="table delete-row-example">
  <thead>
    <tr>
      <th>Name</th> <th>Email</th> <th>Status</th> <th></th>
    </tr>
  </thead>
  <tbody hx-confirm="Are you sure?" hx-target="closest tr" hx-swap="outerHTML swap:1s">
    ...
  </tbody>
</table>
表体有一个 hx-confirm 属性来确认删除动作。 它还将所有按钮的目标设置为最近的 tr,即最近的表格行(hx-target 继承自 DOM 中的父级)hx-swap 中的交换规范表示将整个目标换出并收到响应后等待 1 秒。最后一点是为了让我们可以使用以下 CSS:
tr.htmx-swapping td {
  opacity: 0;
  transition: opacity 1s ease-out;
}
在交换/删除之前淡出该行。每行都有一个带有 hx-delete 属性的按钮,该属性包含发出 DELETE 请求以从服务器中删除该行的 url。此请求以空内容响应,表明该行应替换为空内容
<tr>
  <td>Angie MacDowell</td>
  <td>angie@macdowell.org</td>
  <td>Active</td>
  <td>
    <button class="btn btn-danger" hx-delete="/contact/1">
      Delete
    </button>
  </td>
</tr>
<div hx-get="/graph" hx-trigger="load">
  <img
    alt="正在加载中..."
    class="htmx-indicator"
    width="150"
    src="/img/bars.svg"/>
</div>
当我们加载图表时显示进度指示器。 然后通过稳定的 CSS(htmx-settling) 过渡加载图形并逐渐淡入视图
.htmx-settling img {
  opacity: 0;
}
img {
  transition: opacity 300ms ease-in;
}
| :-- | -- | 
|---|---|
| innerHTML | 默认,替换目标元素的内部 html | 
| outerHTML | 用响应替换整个目标元素 | 
| beforebegin | 在目标元素之前插入响应 | 
| afterbegin | 目标元素的第一个子元素之前插入响应 | 
| beforeend | 目标元素的最后一个子元素之后插入响应 | 
| afterend | 在目标元素之后插入响应 | 
| delete | 无论响应如何,都删除目标元素 | 
| none | 不附加来自响应的内容 (带外项目仍将被处理) | 
| 属性 | 说明 | 
|---|---|
| hx-boost | 添加或删除链接和表单的渐进增强 | 
| hx-get | 向指定的 URL 发出 GET | 
| hx-post | 向指定的 URL 发出 POST | 
| hx-push-url | 将 URL 推入浏览器地址栏,创建一个新的历史条目 | 
| hx-select | 从响应中选择要换入的内容 | 
| hx-select-oob | 从带外(目标以外的某个地方)的响应中选择要换入的内容 | 
| hx-swap | 控制内容的交换方式( outerHTML、beforeEnd、afterend,...) | 
| hx-swap-oob | 将响应中的内容标记为带外(应该在目标以外的地方交换) | 
| hx-target | 指定要交换的目标元素 | 
| hx-trigger | 指定触发请求的事件 | 
| hx-vals | 向参数添加值以随请求一起提交(JSON 格式) | 
使用 htmx 时最常用的属性
| 属性 | 说明 | 
|---|---|
| hx-confirm | 在发出请求之前显示一个 confim()对话框 | 
| hx-delete | 向指定的 URL 发出 DELETE | 
| hx-disable | 禁用给定节点和任何子节点的 htmx 处理 | 
| hx-disinherit | 控制和禁用子节点的自动属性继承 | 
| hx-encoding | 更改请求编码类型 | 
| hx-ext | 用于此元素的扩展 | 
| hx-headers | 添加到将与请求一起提交的标头 | 
| hx-history-elt | 在历史导航期间要快照和恢复的元素 | 
| hx-include | 在请求中包含额外数据 | 
| hx-indicator | 在请求期间放置 htmx-request类的元素 | 
| hx-params | 过滤将与请求一起提交的参数 | 
| hx-patch | 向指定的 URL 发出 PATCH | 
| hx-preserve | 指定在请求之间保持不变的元素 | 
| hx-prompt | 在提交请求之前显示一个 prompt() | 
| hx-put | 向指定的 URL 发出 PUT | 
| hx-replace-url | 替换浏览器地址栏中的 URL | 
| hx-request | 配置请求的各个方面 | 
| hx-sse | 已移至分机。 旧版本的文档 | 
| hx-sync | 控制不同元素发出的请求如何同步 | 
| hx-validate | 强制元素在请求之前验证自己 | 
| hx-vars | 将值动态添加到参数以随请求提交(已弃用,请使用 hx-vals) | 
| hx-ws | 已移至分机。旧版本的文档 | 
列出了 htmx 中可用的所有其他属性
| Class | 说明 | 
|---|---|
| htmx-added | 在交换之前应用于新的内容,在它被解决之后移除 | 
| htmx-indicator | 一个动态生成的类,当存在 htmx-request类时将切换可见(不透明度: 1) | 
| htmx-request | 在请求进行时应用于元素或使用 hx-indicator指定的元素 | 
| htmx-settling | 内容交换后应用于目标,内容确定后删除。 可以通过 hx-swap修改持续时间 | 
| htmx-swapping | 在交换任何内容之前应用于目标,在交换之后移除。 可以通过 hx-swap修改持续时间 | 
| 事件 | 说明 | 
|---|---|
| htmx:abort | 将此事件发送到元素以中止请求 | 
| htmx:afterOnLoad | AJAX 请求完成处理成功响应后触发 | 
| htmx:afterProcessNode | 在 htmx 初始化节点后触发 | 
| htmx:afterRequest | AJAX 请求完成后触发 | 
| htmx:afterSettle | DOM 稳定后触发 | 
| htmx:afterSwap | 换入新内容后触发 | 
| htmx:beforeOnLoad | 在任何响应处理发生之前触发 | 
| htmx:beforeProcessNode | 在 htmx 初始化节点之前触发 | 
| htmx:beforeRequest | 在发出 AJAX 请求之前触发 | 
| htmx:beforeSwap | 在交换完成之前触发,允许您配置交换 | 
| htmx:beforeSend | 在发送 ajax 请求之前触发 | 
| htmx:configRequest | 在请求之前触发,允许您自定义参数、标头 | 
| htmx:confirm | 在元素上发生触发器后触发 允许您取消(或延迟)发出 AJAX 请求 | 
| htmx:historyCacheError | 在缓存写入期间因错误而触发 | 
| htmx:historyCacheMiss | 在历史子系统中的缓存未命中时触发 | 
| htmx:historyCacheMissError | 远程检索不成功时触发 | 
| htmx:historyCacheMissLoad | 在成功的远程检索时触发 | 
| htmx:historyRestore | 当 htmx 处理历史恢复操作时触发 | 
| htmx:beforeHistorySave | 在内容保存到历史缓存之前触发 | 
| htmx:load | 当新内容添加到 DOM 时触发 | 
| htmx:noSSESourceError | 当元素在其触发器中引用 SSE 事件 但未定义父 SSE 源时触发 | 
| htmx:onLoadError | htmx中onLoad处理异常时触发 | 
| htmx:oobAfterSwap | 在交换了一个带元素之后触发 | 
| htmx:oobBeforeSwap | 在带外元素交换完成之前触发,允许您配置交换 | 
| htmx:oobErrorNoTarget | 当带外元素在当前 DOM 中没有匹配的 ID 时触发 | 
| htmx:prompt | 显示提示后触发 | 
| htmx:pushedIntoHistory | 在 url 被推送到历史记录后触发 | 
| htmx:responseError | 当发生 HTTP 响应错误 (非 200 或 300 响应代码)时触发 | 
| htmx:sendError | 当网络错误阻止 HTTP 请求发生时触发 | 
| htmx:sseError | 当 SSE 源发生错误时触发 | 
| htmx:swapError | 在交换阶段发生错误时触发 | 
| htmx:targetError | 指定无效目标时触发 | 
| htmx:timeout | 发生请求超时时触发 | 
| htmx:validation:validate | 在验证元素之前触发 | 
| htmx:validation:failed | 当元素验证失败时触发 | 
| htmx:validation:halted | 当请求由于验证错误而停止时触发 | 
| htmx:xhr:abort | 当 ajax请求中止时触发 | 
| htmx:xhr:loadend | ajax请求结束时触发 | 
| htmx:xhr:loadstart | ajax请求开始时触发 | 
| htmx:xhr:progress | 在支持进度事件的 ajax请求期间定期触发 | 
| 方法 | 说明 | 
|---|---|
| htmx.addClass() | 向给定元素添加一个类 | 
| htmx.ajax() | 发出一个 htmx 风格的 ajax 请求 | 
| htmx.closest() | 找到与选择器匹配的给定元素的最近父级 | 
| htmx.config | 保存当前 htmx 配置对象的属性 | 
| htmx.createEventSource | 包含为 htmx 创建 SSE EventSource 对象的函数的属性 | 
| htmx.createWebSocket | 包含为 htmx 创建 WebSocket 对象的函数的属性 | 
| htmx.defineExtension() | 定义一个 htmx 扩展 | 
| htmx.find() | 查找与选择器匹配的单个元素 | 
| htmx.findAll()|htmx.findAll(elt, selector) | 查找与给定选择器匹配的所有元素 | 
| htmx.logAll() | 安装将记录所有 htmx 事件的记录器 | 
| htmx.logger | 设置为当前记录器的属性(默认为空) | 
| htmx.off() | 从给定元素中删除事件侦听器 | 
| htmx.on() | 在给定元素上创建事件侦听器,并返回它 | 
| htmx.onLoad() | 为 htmx:load 事件添加回调处理程序 | 
| htmx.parseInterval() | 将间隔声明解析为毫秒值 | 
| htmx.process() | 处理给定元素及其子元素,连接任何 htmx 行为 | 
| htmx.remove() | 删除给定的元素 | 
| htmx.removeClass() | 从给定元素中删除一个类 | 
| htmx.removeExtension() | 删除一个 htmx 扩展 | 
| htmx.takeClass() | 从给定元素的其他元素中获取一个类 | 
| htmx.toggleClass() | 从给定元素切换一个类 | 
| htmx.trigger() | 在元素上触发事件 | 
| htmx.values() | 返回与给定元素关联的输入值 | 
| 标头 | 说明 | 
|---|---|
| HX-Boosted | 表示请求是通过使用 hx-boost的元素发出的 | 
| HX-Current-URL | 浏览器的当前 URL | 
| HX-History-Restore-Request | 如果请求是在本地历史缓存未命中后进行历史恢复,则为 true | 
| HX-Prompt | 用户对 hx提示的响应 | 
| HX-Request | 总是 true | 
| HX-Target | 目标元素的 id(如果存在) | 
| HX-Trigger-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 | 将内容更新的目标更新为页面上不同元素的 CSS 选择器 | 
| HX-Trigger | 允许您触发客户端事件 请参阅文档以获取更多信息 | 
| HX-Trigger-After-Settle | 允许您触发客户端事件 请参阅文档以获取更多信息 | 
| HX-Trigger-After-Swap | 允许您触发客户端事件 请参阅文档以获取更多信息 |