hx-swap-oob

hx-swap-oob 属性允许你指定响应中的某些内容应该被交换到目标以外的 DOM 中,即 “Out of Band”。这允许你将更新带到响应中的其他元素更新。

考虑以下响应 HTML:

<div>
 ...
</div>
<div id="alerts" hx-swap-oob="true">
    Saved!
</div>

第一个 div 将以通常的方式换入目标。但是,第二个 div 将作为具有 id 的元素的替换被换入 alerts,并且不会最终进入目标。

hx-swap-oob 的值可以是:

  • true
  • 任何 hx-swap 有效值
  • 任何 hx-swap 有效值,后跟冒号,后跟 CSS 选择器

如果值为 true 或 outerHTML(等效),则元素将内联交换。

如果给出了交换值,则将使用该交换策略,并且除 outerHTML 之外的所有策略的封装标签对都将被剥离。

如果指定了选择器,则将交换与该选择器匹配的所有元素。如果没有,则将交换 ID 与新内容匹配的元素。

使用替代交换策略

如前所述,当使用除 true 或 outerHTML 之外的交换策略时,封装标签会被剥离,因此你需要使用适合上下文的正确标签来封装返回的数据。

<tr>尝试在使用的表中插入时<tbody><tbody hx-swap-oob="beforeend:#table tbody">
    <tr>
        ...
    </tr>
</tbody>

一个“普通”的表格:

<table hx-swap-oob="beforeend:#table2">
    <tr>
        ...
    </tr>
</table>

<li> 可以被封装在<ul>、<ol> 或中,例如<div>:<span>

<ul hx-swap-oob="beforeend:#list1">
    <li>...</li>
</ul>

<p> 可以封装在<div> 或 <span> 中:

<span hx-swap-oob="beforeend:#text">
    <p>...</p>
</span>

麻烦的表格和列表

请注意,你可以使用 template 标签来封装那些根据 HTML 规范不能在 DOM 中独立存在的元素类型(如:<tr>、<td>、<th>、<thead>、<tbody>、<tfoot>、<colgroup>、<caption><col><li> )。

下面是一个以这种方式封装表行带外交换的示例:

<div>
    ...
</div>
<template>
    <tr id="row" hx-swap-oob="true">
        ...
    </tr>
</template>

请注意,这些模板标签将从页面的最终内容中删除。

丝滑的 SVG

某些元素类型(如 SVG)对其子元素使用特定的 XML 命名空间。除非将内部元素封装在标签中,否则在替换时,内部元素 svg 无法正常工作。要修改现有 SVG 的内部内容,你可以同时使用 template 和 svg 标签来封装元素,让它们应用正确的命名空间。

下面是一个以这种方式封装 svg 元素的带外交换示例:

<div>
    ...
</div>
<template><svg>
    <circle hx-swap-oob="true" id="circle1" r="35" cx="50" cy="50" fill="red" /> 
</svg></template>
<template><svg hx-swap-oob="beforebegin:#circle1">
    <circle id="circle2" r="45" cx="50" cy="50" fill="blue" /> 
</svg></template>

这将内联替换 circle1,然后在 circle1 之前插入 circle2。

请注意,这些标签 template 和 svg 包装标签将从页面的最终内容中删除。

嵌套 OOB 交换

默认情况下,响应中任意位置具有 hx-swap-oob= 属性的任何元素都会针对 oob 交换行为进行处理,包括当元素嵌套在主响应元素中时。当使用模板片段时,这可能会有问题,因为片段可能被重新用作 oob-swap 目标,也可以作为更大片段的一部分。当较大的 fragment 是主要响应时,内部 fragment 仍将作为 oob swap 处理,将其从 dom 中删除。

可以通过将配置设置 htmx.config.allowNestedOobSwaps 为 false 来更改此行为 。如果此配置选项为,则仅当元素与主响应元素相邻 false 时才处理 OOB 交换,其他地方的 OOB 交换将被忽略,并且与 oob-swap 相关的属性将被剥离。

笔记

  • hx-swap-oob不会被继承