0
0

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を使ってみた-(8)要素の変更-

Last updated at Posted at 2024-10-22

hx-swap属性による、要素の置換方法

サーバーからHTML形式の返事が来たときに、hx-target属性で指定された(指定しなければ、自分自身)要素を、ht-swap属性に指定された方法で変更します。

swap指定 要素の置換方法
innerHTML デフォルト。要素の中身を変える
outerHTML 要素自身を変える
afterbegin 要素の中の最初の子の前に追加します
beforebegin 要素の前に追加します
beforeend 要素内の最後の子の後に追加します
afterend 要素の後に追加します
delete 要素を削除
none 何もしない

練習プログラムでは、

html04.j2
<form hx-post="/add_institution" hx-target="#add_btn" hx-swap="beforebegin">

とし、hx-swap属性に"beforebegin"を指定して、hx-target属性のid="add_btn"の前に、サーバーからの返事を追加しています。
追加される方(id="add_btn")は、

html00.j2
<tr id="add_btn" hx-on::before-swap="change_institution(event)">

とし、要素が書き換えられる前に、hx-on属性の指定に従ってchange_institution()関数を起動しています。

AJAXの戻り値の評価

サーバーのデータを、変更・削除・追加する場合、何らかのエラーが起こることがあります。
htmxはサーバーからの応答で、要素の書き換えを行いますので、書き換える前に、処理が成功したかどうかを判断する必要があります。

以下は、AJAXレスポンスを処理する1手法です。
他にもっと良い方法があると思います。(このような方法しか思いつきませんでした)

練習プログラムでは、

html00.j2
<tr id="add_btn" hx-on::before-swap="change_institution(event)">

の hx-on::before-swap で change_institution()関数を指定し、AJAXの戻り値を評価します。

before-swapイベントで間違えたこと。
htmxの属性は付けたタグに作用する。
hx-target属性で指定した要素にhx-on::before-swapを付けなければならない。

最初、「AJAXの戻り値で、要素が書き換えられる前に評価する」ために、

<form hx-post="/add_institution" 
hx-target="#add_btn" 
hx-swap="beforebegin"
hx-on::before-swap="change_institution(event)"
>

と書きました。
目的としたことは、

  1. formが送信されると、
  2. hx-post属性により、HTTPのPOSTメソッドで、サーバーの/add_institutionにアクセスし、
  3. hx-target属性により、サーバーからの応答で、idに"add_btn"を持つタグの中身を、
  4. hx-swap属性の指定した方法(beforebegin)で書き換える前に、
  5. hx-on属性の指定(before-swap)により、戻り値の評価ルーチン(change_institution())を動かす

でした。

上記の場合、 hx-targetで自身とは違う要素を指定しています ので、自身はAJAXの戻り値で書き換えられることはなく、before-swapイベントが発火しません。
hx-on::before-swap=""は、hx-target=""で指定した要素に付ける必要があります。

戻り値を評価する関数

change_institution()関数は、p00.jsにあります。

p00.js
function change_institution(event) {
	close_dialog();
	if (event.detail.xhr.status == 200) {
		// 成功時の処理
		responseText = event.detail.xhr.responseText;
		if (responseText == 'データを削除しました') {
			return;
		}
		if (!responseText.includes('<tr')) {
			alert(responseText);
			console.table(event.detail.xhr);
			event.preventDefault();
		}
	} else {
		// 失敗時の処理
		alert("サーバーとの通信に失敗しました");
		console.table(event.detail.xhr);
		event.preventDefault();
	}
}

event引数にbefore-swapイベントの値が入ってきます。
練習プログラムでは、

  1. event.detail.xhr.statusを評価して、
  2. サーバーで問題なければ、帰ってきた内容を吟味します。
  3. もし、帰ってきたデータに<tr がなければ、変更・削除が失敗した(他分別のPCで書き換えられている)として、event.preventDefault()関数でJavaScriptの実行を中止=要素を書き換えない=で終わります。
  4. event.detail.xhr.statusでサーバーの処理で問題がある場合、エラーを出して処理を中止します。

練習プログラムでは、「施設追加」の行の上に、新しいデータが表示されます。

関連記事一覧

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)データ削除-(最終)

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?