hx-swap

hx-swap 属性允许你指定如何相对 AJAX 请求的响应进行交换。如果你未指定该选项,则默认为 htmx.config.defaultSwapStyle(innerHTML)。

该属性可能的值包括:

  • innerHTML - 替换目标元素的内部 html
  • outerHTML - 用响应替换整个目标元素
  • textContent - 替换目标元素的文本内容,而不将响应解析为 HTML
  • beforebegin - 在目标元素之前插入响应
  • afterbegin - 将响应插入到目标元素的第一个子元素之前
  • beforeend - 将响应插入到目标元素的最后一个子元素之后
  • afterend - 在目标元素后插入响应
  • delete - 无论响应如何都删除目标元素
  • none - 不附加响应中的内容(带外项目仍将被处理)。

这些选项基于标准 DOM 命名和 Element.insertAdjacentHTML 规范。

在以下代码中:

  <div hx-get="/example" hx-swap="afterend">Get Some HTML & Append It</div>

div 将向 /example 发出请求并将返回的内容附加到 div

修饰符

属性 hx-swap 支持用于改变交换行为的修饰符。它们概述如下:

过渡:transition

如果你想在发生交换时使用新的 View Transitions API,你可以为交换使用 transition:true 选项。你也可以通过将 htmx.config.globalViewTransitions 配置设置设为 true 来全局启用此功能。

时间安排:swap & settle

你可以通过添加修饰符来修改 htmx 在收到响应后等待交换内容的时间:

  <!-- this will wait 1s before doing the swap after it is received -->
  <div hx-get="/example" hx-swap="innerHTML swap:1s">Get Some HTML & Append It</div>

类似地,你可以通过添加修饰符来修改交换和结算逻辑之间的时间:

  <!-- this will wait 1s before doing the swap after it is received -->
  <div hx-get="/example" hx-swap="innerHTML settle:1s">Get Some HTML & Append It</div>

这些属性可用于将 htmx 与 CSS 过渡效果的时间同步。

标题:ignoreTitle

默认情况下,如果 htmx 在响应内容中找到 <title> 标签,它将更新页面标题。你可以通过将选项设置为 true 来关闭此行为。

滚动:scroll&show

你还可以使用 scroll 和 show 修饰符来更改目标元素的滚动行为,它们均采用值 top 和 bottom :

  <!-- this fixed-height div will scroll to the bottom of the div after content is appended -->
  <div style="height:200px; overflow: scroll" 
       hx-get="/example" 
       hx-swap="beforeend scroll:bottom">
     Get Some HTML & Append It & Scroll To Bottom
  </div>
  ```

  ```html
  <!-- this will get some content and add it to #another-div, then ensure that the top of #another-div is visible in the 
       viewport -->
  <div hx-get="/example" 
       hx-swap="innerHTML show:top"
       hx-target="#another-div">
    Get Some Content
  </div>

如果你希望针对不同的元素进行滚动或显示,你可以在 scroll 或 show 之后放置一个 CSS 选择器,然后是 :top 或 :bottom:

  <!-- this will get some content and swap it into the current div, then ensure that the top of #another-div is visible in the 
       viewport -->
  <div hx-get="/example" 
       hx-swap="innerHTML show:#another-div:top">
    Get Some Content
  </div>

你还可以使用 window:top 和 window:bottom 滚动到当前窗口的顶部和底部。

  <!-- this will get some content and swap it into the current div, then ensure that the viewport is scrolled to the
       very top -->
  <div hx-get="/example" 
       hx-swap="innerHTML show:window:top">
    Get Some Content
  </div>

对于增强链接和表单,默认行为是 show:top 。你可以使用htmx.config.scrollIntoViewOnBoost 全局禁用它 ,也可以基于元素使用 hx-swap="show:none" 进行禁用。

<form action="/example" hx-swap="show:none">
  ...
</form>

焦点滚动

htmx 能够在保留 input 元素的焦点。默认情况下,htmx 会阻止在请求之间自动定位到焦点 input 元素,当用户已经滚动离开时,这可能是较长请求中不受欢迎的行为。要启用焦点滚动,你可以使用focus-scroll:true。

<input id="name" hx-get="/validation" 
       hx-swap="outerHTML focus-scroll:true"/>

或者,如果你希望页面在每次请求后自动定位到焦点元素,你可以将 htmx 全局配置 htmx.config.defaultFocusScroll 的值更改为 true。然后针对特定请求禁用它 focus-scroll:false。

  <input id="name" hx-get="/validation" 
       hx-swap="outerHTML focus-scroll:false"/>

笔记

  • hx-swap 可以继承并放置在父元素上
  • 该属性的默认值为 innerHTML
  • 由于 DOM 限制,无法在 元素上使用 outerHTML 方法。htmx 将会把 元素上的的 outerHTML 改为 innerHTML。
  • 默认交换延迟为 0ms
  • 默认稳定延迟为 20ms