コンテンツにスキップ

026. hx-select-oob(範囲外コンテンツの同時つまみ食い)

原理:「最高のパーツ」をあちこちから集める選別術

OOBとセレクトの強力なコンボ

前回の記事で紹介した hx-select(つまみ食い)と hx-swap-oob(範囲外更新)を覚えていますか? これら二つの性質を併せ持った、より高度でテクニカルな属性が hx-select-oob です。

通常、hx-select は「メインのターゲット(hx-target)」に流し込むためのパーツを選ぶものでした。 しかし、hx-select-oob を使うと、サーバーから届いた大きなHTMLの中から、「メインではない別の場所を更新するためのパーツ」までも、同時につまみ食いして配送することができます。

サーバーが「ページ全体のHTML」しか返してくれない頑固な仕様であっても、ブラウザ側(HTMX)だけで「ここからメイン記事を抜き出し、あっちからはサイドバーの最新情報を抜き出して更新する」という、まるでパズルのような精密な複数箇所更新が可能になります。

HTMLをメモリ上で分解する技術

この属性が指定されると、HTMXはサーバーからのレスポンスを受け取った瞬間、以下のステップを高速に実行します。 1. レスポンス全体のHTMLを一旦読み込む。 2. hx-select-oob に指定されたIDやクラスを探し出し、そのパーツをハサミで切り取る。 3. 切り取ったパーツを、画面上の対応するIDの場所へ直接届ける(OOB配送)。 4. 残ったメインのパーツを、当初のターゲット(hx-target)へ届ける。


実践:1回のフルページ読み込みから複数の場所を救い出す

1. ページ遷移なしで記事とサイドバーを同時更新

サーバーが常にページ全体(<body>の中身全部など)を返してくる場合に、メインコンテンツとサイドバーのバッジだけを抜き出して更新する例です。

<!-- 
  hx-get: 詳細ページを読みに行く
  hx-select: メインの中身 "#article" を、今の "#main-content" に入れる
  hx-select-oob: 返ってきたHTML内にある "#user-stat" も抜き出し、画面上の同じIDを更新する
-->
<button hx-get="/next-page" 
        hx-select="#article" 
        hx-target="#main-content"
        hx-select-oob="#user-stat">
    次の記事へ
</button>

<main id="main-content">
  <!-- ここがメインの更新場所 -->
</main>

<div id="user-stat">
  <!-- ここが OOB でついでに更新される場所 -->
</div>

2. カンマ区切りによる複数箇所の指定

hx-select-oob には、複数のIDを並べて書くこともできます。

<button hx-get="/refresh" 
        hx-select="#main" 
        hx-select-oob="#nav-summary, #footer-info">
    一括更新
</button>

3. ステップ・バイ・ステップ解説

  1. ターゲットの定義: まずは一番大きく変えたい場所(hx-target)と、そこに入れるパーツ(hx-select)を決めます。
  2. ついでに更新したい場所: サーバーから返ってくるHTMLを想像し、そこにある別のパーツのIDを hx-select-oob に書きます。
  3. セレクタの厳密さ: 指定したIDやクラスが、サーバーから返ってくるHTMLの中に必ず存在していることを確認してください。存在しない場合は、その場所の更新は単にスキップされます。

比較:JSONによる複数更新 vs hx-select-oob

JSON APIの場合

const response = await fetch('/api/data');
const json = await response.json();
// それぞれのHTML文字列を別々に流し込む
document.querySelector('#main').innerHTML = json.mainHtml;
document.querySelector('#nav').innerHTML = json.navHtml;
サーバー側で「わざわざJSON形式に組み立てる」という手間が発生します。

HTMXの hx-select-oob

サーバーはいつも通り「普通のHTMLページ(または大きなパーツ)」を返すだけです。 フロントエンド側で「どこを抜き出すか」を指定するだけで、サーバーサイドのロジックを一ミリも変更せずに、リッチな複数箇所更新を実現できます。これは既存のシステム(レガシーシステム)を壊さずに進化させる時に、とてつもない威力を発揮します。


まとめ:初心者のための「ハサミ」の使い方

hx-select-oob を使いこなすと、サーバーの「不自由さ」を「自由」に変えることができます。

  • 不測の事態に強い: サーバーがこちらの期待通りの「小さなパーツ」を返してくれなくても、自分で切り取れば済むという安心感があります。
  • IDを整理する: 抜き出す側と、流し込む側のIDを一致させておくのが成功の秘訣です。
  • 効率を考える: 便利ですが、常に大きなHTMLをやりとりすることには変わりありません。非常にトラフィックが多い場所では、サーバー側で最初から必要な分だけ返すようにする方がスマートです。

届いた素材をどう料理するか、その主導権はサーバーではなくあなたにあります。hx-select-oob という精密なハサミを使って、画面を自由自在にデザインしてください。次の記事では、通信を行う際に「おまけの情報」を添えて送るための hx-vals(027. hx-vals)をご紹介します。