适合初学者的综合 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 | 允许您触发客户端事件 请参阅文档以获取更多信息 |