コンテンツにスキップ

053. hx-target Header(「どこを」変えるつもりかをサーバーに伝える)

原理:更新場所という「情報の共有」

サーバーはフロントエンドの状況を知りたがっている

HTMXで「保存ボタン」を押した時、ブラウザ側では hx-target="#main-content" のように、更新すべき場所(ターゲット)がすでに決まっています。

通常、サーバーは「何が届いたか」だけに注目して処理を行いますが、時には「今からブラウザの『どこ』が書き換えられようとしているのか」を知ることで、より気の利いたお返事ができることがあります。

例えば: - 「もし中央の画面がターゲットなら、詳しい説明用のHTMLを返そう」 - 「もし右上の通知ボタンがターゲットなら、短い通知メッセージだけを返そう」 このように、「着弾地点」をサーバーに教えるためのヘッダーhx-target です。


実践:ターゲットに合わせた「お返事」の使い分け

1. サーバー側でのターゲット判定(疑似コード)

リクエストヘッダーからターゲットのIDを読み取って、処理を分岐させる例です。

// Express (Node.js) の例
app.post('/save', (req, res) => {
    const targetId = req.get('hx-target');

    if (targetId === 'full-modal') {
        // モーダルを閉じるための特別なHTMLを返す
        res.send('<div id="full-modal" hx-swap-oob="delete"></div>');
    } else {
        // 通常の更新用パーツを返す
        res.send('<span>保存完了!</span>');
    }
});

2. 複数のボタン、共通のURL

同じ送信先(URL)であっても、押したボタンによって hx-target が違う場合、サーバーはこのヘッダーを見て「今はどっちのボタンの世話をすればいいか」を正確に把握できます。

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

  1. フロントの定義: あなたがHTMLに書いた hx-target="#my-id" の中身(ここでは my-id)が、自動的にヘッダーとして送信されます。
  2. サーバーの読み取り: サーバー側で hx-target という名前のヘッダーから値を取り出します。
  3. 臨機応変なレスポンス: 取り出したIDに応じて、最適なHTML(パズルのピース)を選んで返します。

特徴:HTMXが教える「着弾地点」の正体

  • IDそのものが届く: セレクタに # が付いていても、ヘッダーに届くのは純粋なID名(例:search-results)になります。
  • IDがない場合: もしターゲットがID指定でなかったり(CSSクラスなど)、指定されていなかったりする場合は、このヘッダーは送られないか、あるいは信頼できない値になります。ターゲットには明確なIDを振っておくのが「良い設計」のコツです。

まとめ:初心者のための「阿吽の呼吸」その2

hx-target ヘッダーは、ブラウザとサーバーの間で「同じ共通認識(どこを更新するか)」を持つための、スマートな架け橋です。

  • 連携の質を高める: フロントエンドの状況(どのエリアを更新しようとしているのか)をサーバーが知ることで、サーバーサイドのプログラムはより「フロントエンドに優しい」一品を返すことができるようになります。
  • 条件分岐の材料に: 「全部書き換える」のか「一部だけ付け足す」のかを、このヘッダーを使ってサーバーへそっと相談してみましょう。
  • デバッグでも役立つ: 「意図した場所がターゲットになっていないかも?」と思ったら、このヘッダーの値をチェックしてみてください。

どこに着弾するかを、こっそり共有する。hx-target を活用して、あなたのWebアプリに、状況に応じた「機転の利く」レスポンスを実装してください。次の記事では、リクエストが「どのURLから」飛んできたかを伝える hx-current-url(054. hx-current-url)をご紹介します。