TL;DR
<form>で
submit
イベントを発火させるときは<button>にtype="submit"
が指定されていることを確認しよう
あるいは
type
になにも指定しなければ自動でsubmit
になります。なにも指定しなければ。
この記事は何?
GitHub Copilot
に頼りすぎた愚かな開発者(筆者)がHTMLの基本を忘れたことを戒めるための記事です。
起きたこと
それはSvelteKit
のForm Actions学習中のことでした。
筆者はGitHub Copilot
を使いながら、以下のコードを作成しました。
<script lang="ts">
import type { ActionData } from './$types';
export let form: ActionData;
</script>
<h1>{form}</h1>
<form method="POST">
<button type="button">
Click
</button>
</form>
import { error } from '@sveltejs/kit';
import type { Actions } from './$types';
export const actions: Actions = {
default: async () => 'Hello World!'
};
(.svelte
もシンタックスハイライト対応しないかな...)
ここで詳しい話は割愛いたしますが、+page.svelte
でform
がsubmit
された場合、+page.server.ts
で定義したForm Actions
が実行され、画面に"Hello World!"と出力されるのが期待される動作です。
しかし実際には{form}
はnull
のまま動きません。
解決方法
<-- 下記コードを -->
<button type="button">
Click
</button>
<-- こうする -->
<button>
Click
</button>
特に必要のない解説
あまり説明することもないのですが、<button type="button" />
と、ボタンのtype
にbutton
が指定されている場合、submit
する能力を失ってただのボタンになっています。
そのためイベントが発火せず、Form
が送信されなかったということです。
ボタンの
type
が指定されていない場合の初期値はsubmit
です。form 内の button 要素を押すと submit される理由
type
がbutton
の場合でも、イベントハンドラーを登録することで発火させることが可能
まとめ
GitHub Copilot
は非常に頼れる開発ツールですが、盲目的になってはいけないと再確認しました。
少なくとも、出力された結果に対してしっかり理解する姿勢が必要です。
ちなみに原因特定はChatGPT
にお願いしました。
便利な世の中になったものです。いや、ほんと。