1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

htmxを使ってみた-(1)htmxの基本-

Last updated at Posted at 2024-10-22

htmxとは何か

  • htmxとは、HTMLのタグに独自の属性(attribute)を付けることで、簡単にAJAXできるようにするJavaScriptライブラリ(小さなフレームワーク)です。
  • HTMLの自然な拡張になっており、JacaScriptのコードをほとんど書く必要がありません。
  • サーバーからの応答はHTML形式を想定しています。
  • 最近流行ののSPA(Single Page Application)を作るのに適しています。
  • 学習コストが低く、他のライブラリのように、独自の文法や使い方を覚える必要がありません。
  • jQueryの代替になるかもしれません。

以下、htmxのドキュメントの抜粋=私が理解して使ったものだけ=です。

htmxのインストール

UNPKGの当該ページからダウンロードして、scriptタグで貼り付けます。
2020/10/10現在の最新バージョンは、2.0.2でした。
ダウンロードしたファイルには、バージョン番号を付けておくことを推奨します。
HTMLファイルのヘッダに、

<script src="htmx-2.0.2.js"></script>

などとして貼り付けます。

htmxの基本

htmxはHTMLのタグに独自の属性を付けることで、AJAXができるようにしています。
例えば、

<div hx-get="/get_message">Click</div>

のように記述すると、

  1. DIVタグをクリックすることで、(デフォルトのAJAXのトリガはクリック)
  2. hx-get属性により、HTTPのGETメソッドで、サーバーの /get_message にアクセスし、
  3. サーバーからの返答(HTMLデータ)で、DIVタグの中身を入れ替える。(デフォルトで、入れ替える先は自分自身の中身)

という動作をします。
他のライブラリやフレームワークに比べて、簡単にAJAXを実現することができます。

サポートするHTTPメソッド

htmxがサポートするHTTPメソッドは以下のとおりです。

htmx属性 HTTPメソッド 説明
hx-get GET 参照:データを要求する
hx-post POST 新規作成:新しいデータの作成を要求する
hx-put PUT 更新:データを更新する
hx-patch PATCH 一部更新:データの一部を更新する
hx-delete DELETE 削除:データの削除を要求する

AJAXのトリガー

AJAXリクエストが行われるためのトリガーは以下のとおりです。

HTMLタグ トリガー
input、textarea、select 内容が変わったとき(onChange)
form submitされたとき(submitボタンが押された)(onSubmit)
その他 クリックされたとき(onClick)

発火を遅らせる、ポーリング、特定のキーの組み合わせ、特別なイベントなど、トリガーを修飾することができます。

AJAXの適用先

標準では、自分自身ですが、hx-target属性で、適用先(書き換え先)を指定することができます。

<button hx-get="/example" hx-target="#search-results">Get Some HTML</button>
<div id="search-results"></div>

適用先の指定には、CSSセレクタが使えます。
上記の例では、

  1. ボタンをクリックすると、
  2. hx-get属性により、HTTPのGETメソッドで、サーバーの/exampleにアクセスし、
  3. hx-target属性により、サーバーからの応答で、idに"search-results"を持つタグの中身を書き換えます。

要素の置換方法

標準ではタグの中身を書き換えますが、hx-swap属性で、置換方法を指定することができます。

指定方法 置換方法
innerHTML 要素の中身。 標準
outerHTML 要素そのもの=タグとその中身を書き換える
afterbegin 要素内の最初の子要素の前に追加します
beforebegin 要素の直前に追加
beforeend 要素内の最後の子要素の後に追加します
afterend 要素の直後に追加
delete 要素を削除
none 何もしない

置換をモーフィングさせることや、オプションで置換の様子を変えることもできます。

「boost」対応

アンカータグ(<a>)やフォームタグ(<form>)は、サーバーからのページ全体のデーターを送ってもらいブラウザを書き換え(ページ遷移)ますが、htmxでは、hx-boost属性を設定することで、アンカータグやフォームタグをAJAX化して、<body>の内容だけを書き換えるようにできます。

<div hx-boost="true">
    <a href="/blog">Blog</a>
</div>

HTMLの<head>で多くのファイルを読み込ませている場合に便利だそうです。

イベント対応

hx-on属性を付けることで、要素にイベントをつけることができます。
主な(使用頻度の高そうな)イベントには次のものがあります。

イベント名 説明
afterRequest AJAXが完了した
afterSettle DOMが落ち着いた
afterSwap 要素が書き換えられた
beforeRequest AJAXを実行する前
beforeSwap 要素を書き換える前
beforeSend AJAXリクエストを送る前
responseError HTTPレスポンスがエラーコード(200 または 300 代以外)を返したとき
sendError ネットワークエラーによりHTTPリクエストができない
swapError 要素の書き換え時にエラーが起こった
targetError 無効なターゲットが指定された
timeout リクエストがタイムアウトした

他にも多くのイベントがあります。
イベントを使う場合は、

<button hx-get="/info" hx-on::before-request="alert('Making a request!')">
    Get Info!
</button>

のように記述します。
イベント名はキャメルケースで書かれていますが、HTMLに記述するときはケバブケースにする必要があります。(ver.2.0.2の制限か?)

JavaScript API

htmxには、簡単にJavaScriptを呼び出す仕組みがあります。
主な(使用頻度の高そうな)ものには次のものがあります。

JavaScript API 説明
htmx.addClass() 要素にCSSのクラスを追加
htmx.closest() 親要素のセレクタに合うもので一番近いものを選択
htmx.find() セレクタに合う要素を選択
htmx.findAll() セレクタに合う要素をすべて選択
htmx.remove() 要素を削除
htmx.removeClass() 要素からCSSクラスを削除
htmx.toggleClass() 要素のクラスを入れ替える
htmx.values() 要素の値を得る

他にも、多くのAPIがあります。
APIを使う場合は、

var div = htmx.find("#my-div")
htmx.addClass(htmx.find('#demo'), 'myClass');

のように記述します。

関連記事一覧

htmxを使ってみた-(1)htmxの基本-
htmxを使ってみた-(2)準備-
htmxを使ってみた-(3)ルート関数-
htmxを使ってみた-(4)htmxを使う-
htmxを使ってみた-(5)HTMLのdialog-
htmxを使ってみた-(6)データの表示-
htmxを使ってみた-(7)データ追加-
htmxを使ってみた-(8)要素の変更-
htmxを使ってみた-(9)ページの再読み込み-
htmxを使ってみた-(10)データの変更-
htmxを使ってみた-(11)データベースの排他制御-
htmxを使ってみた-(12)確認ダイアローグ-
htmxを使ってみた-(13)データ削除-(最終)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?