コンテンツにスキップ

101. hx-on: エラーイベントの捕捉(JavaScriptと連携して、予期せぬ事態に応答する)

原理:HTMXの「声」を聴く

属性だけでは届かない場所へ

これまでのHTMXは、基本的にはHTMLの属性だけで完結してきました。しかし、エラーハンドリングの世界では、「もしエラーが起きたら、画面のここに警告を出しつつ、さらに音を鳴らしたい」とか「ログを別のサーバーに送りたい」といった、少しだけ複雑なJavaScriptの助けが必要な場面があります。

hx-on 属性(特に hx-on:htmx:response-error など)を使うと、「HTMXが通信の過程で発する『エラーが起きた!』という信号(イベント)」を捕まえ、それに対して自分だけのカスタムな反応(JavaScript)を実行させることができます。


実践:トラブルを確実にキャッチする

1. 通信失敗時に通知を出す(hx-on::error)

最も基本的で便利な、通信エラー全体をキャッチする例です。

<!-- 
  hx-on::error : 
  ネットワークが切れている、サーバーがダウンしているなど、
  リクエスト自体が失敗したときに発動します。
-->
<button hx-get="/api/data" 
        hx-on::error="alert('サーバーと通信できませんでした。')">
    最新情報を取得
</button>

2. 特定のステータスコードに応答する(hx-on::response-error)

サーバーは動いているけれど、エラー(400番台や500番台)が返ってきた時の処理です。

<button hx-post="/api/save" 
        hx-on::response-error="console.error('保存に失敗:', event.detail.xhr.status)">
    保存
</button>

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

  1. 監視したいポイントを決める: 「通信自体の失敗(error)」か「サーバーからのエラー返信(response-error)」かを決めます。
  2. イベントの記述: hx-on: のあとにイベント名を書きます(::htmx: の略記法です)。
  3. アクションの記述: 発生時に動かしたい短いJavaScript(例:alert(), console.log())をクォーテーションの中に書きます。

比較:グローバル・ハンドリング vs 個別ハンドリング

グローバル・ハンドリング

  • 方法: ページ全体(bodyなど)で一度だけ設定する。
  • 利点: どのボタンでエラーが起きても共通のメッセージを出せる。一括管理が楽。

個別ハンドリング (hx-on)

  • 方法: 各ボタンやフォームに直接書く。
  • 利点: 「このボタンだけは特別なエラーを出したい」という細かい作り込みができる。

まとめ:初心者のための「もしも」の備え

hx-on によるエラー捕捉は、あなたのWebアプリに「強さ」と「賢さ」をもたらします。

  • ユーザーを「無視」しない: エラーが起きても画面が動かない……という最悪の放置を、この数文字で防げます。
  • JavaScript の入り口として: 「HTMXは便利だけど、やっぱりJSも少しは使いたい」と思ったとき、この hx-on こそが最高に使いやすい入り口になります。
  • event オブジェクトの活用: 書き込んだJavaScriptの中では event という変数を使って、エラーの具体的な中身(ステータスコードなど)を知ることもできます。

想定外さえも、想定内に。hx-on を使って、トラブルの際もユーザーに寄り添い、確実なフィードバックを返せる誠実なWebサイトを目指してください。次の記事では、読み込み中の体験を極める「ローディング状態の全パターン(102. Loading States)」をご紹介します。