htmxで、親タグではないformのデータを送信する方法

こんにちは。 エキサイト株式会社の三浦です。

以前、「htmxでデータを送信する際、送信の設定をしたタグの親にformタグがある場合は、そのformタグに含まれるすべてのデータが送信される」ということを説明しました。 tech.excite.co.jp

今回は、親以外のformタグのデータを送信する方法について説明します。

htmxでデータを送信する際、親formタグのすべてのデータが送られる

以前紹介しましたが、htmxでデータを送信すると、親formタグのデータも一緒に送信されます。 tech.excite.co.jp

多くの場合はそれで問題ないでしょうが、たまにこのような状況も起きうるのではないでしょうか?

  • デザインなどの関係で、htmxの送信設定がされたタグの親formタグとは別のformタグ内にinputタグ等を置きたい
  • ただし、データが送信されたときには、formの垣根を超えて一緒にデータを送りたい

つまり、以下のような状況です。

<script src="https://unpkg.com/htmx.org@1.9.6"></script>

<form id="form_1">
    <input type="hidden" name="data_1" value="データ1"/>

    <!-- htmxの設定により、このテキストフィールドに値が入力されるごとにデータが送信される -->
    <label>
        サンプルテキストフィールド
        <input id="sample_text"
               type="text"
               name="sample_text"

               hx-post="/sample"
               hx-swap="none"
               hx-trigger="input changed"
        />
    </label>
</form>


<form id="form_2">
    <!-- 仕様のためここに置いているが、本来は form_1 のテキストフィールド送信時にデータを送りたい -->
    <input type="hidden" name="data_2" value="データ2"/>
</form>

このままデータを送信すれば、もちろん form_1 としてデータが送られるため、 form_1 に含まれる data_1 が一緒に送られることになります。

form_2 に関連性はないため、 data_2 は送られません。

送信されたデータ

ではこの状態から、タグの配置をそのままに data_2 も一緒に送信するにはどうすればよいのでしょうか?

親タグではないformタグのデータを送信する方法

実は、方法は簡単です。

inputタグには form 属性が存在するのですが、これを使うことで紐付けるformタグを指定することができます。

developer.mozilla.org

それを使うだけです。

<script src="https://unpkg.com/htmx.org@1.9.6"></script>

<form id="form_1">
    <input type="hidden" name="data_1" value="データ1"/>

    <label>
        サンプルテキストフィールド
        <input id="sample_text"
               type="text"
               name="sample_text"

               hx-post="/sample"
               hx-swap="none"
               hx-trigger="input changed"
        />
    </label>
</form>


<form id="form_2">
    <!-- form属性に、紐づけたいformのID値を指定 -->
    <input type="hidden" name="data_2" value="データ2" form="form_1"/>
</form>

上記のようにform属性を使って紐づけたいformを指定すれば、後は同様にデータを送信するだけで、以下のようにデータが送信されます。

送信されたデータ

最後に

親form以外のformにあるデータも一緒に送りたい、というのはそこまで多いケースではないと思いますが、画面が複雑になってくると必要になる可能性はあります。

そういったときに、この記事が参考になれば幸いです!