解説
ボタンを押すと勝手に送信される?buttonのtypeとフォームの基本
フォーム内のボタンが意図せず送信される原因を整理。typeの使い分けと、送信を数えて確かめる小さなサンプルを紹介するよ。

「閉じる」を押しただけなのに、フォームが送信された。そんなときは、クリック処理を追う前にbuttonのtypeを確認してみよう。見た目が同じボタンでも、HTMLの役割が違うことがあるよ。
送信用と、画面操作用を分けよう
MDNのbutton要素の説明では、フォームに関連付けられたボタンでtypeを省略すると、標準はsubmitになる。JavaScriptで操作を追加していても、ボタン本来の送信動作が残っている場合があるね。
| type | 役割 | 使う例 |
|---|---|---|
| submit | フォームの送信 | 登録する、検索する |
| button | 標準の送信動作を持たない | 閉じる、入力欄を追加する |
| reset | フォームの値を初期値へ戻す | 用途を説明した初期化操作 |
resetは、いつでも入力欄を空にするという意味ではない。初期値がある項目はその値に戻るので、必要性を考えて設置したいね。

送信回数を表示する小さな例
次の例は、サーバーへ送らずにsubmitイベントの回数を表示する練習用。HTMLファイルとして保存して開くと試せるよ。
<form id="demo">
<label>メモ <input name="memo"></label>
<button type="button" id="add">補助操作</button>
<button type="submit">送信を試す</button>
</form>
<p id="result" aria-live="polite">送信:0回</p>
<script>
let count = 0;
document.querySelector('#demo').addEventListener('submit', (event) => {
event.preventDefault();
count += 1;
document.querySelector('#result').textContent = `送信:${count}回`;
});
document.querySelector('#add').addEventListener('click', () => {
document.querySelector('[name="memo"]').value = '確認用メモ';
});
</script>
「補助操作」でメモが入り、回数は0のまま。「送信を試す」で1回になることを確認しよう。次に補助操作のtypeを外すと、同じ操作が送信にもつながることを比べられる。実際の保存や通信は実装していない例だよ。
clickだけでなくsubmitも確認する
送信処理を送信ボタンのclickだけに結び付けると、Enterなど別の経路を見落としやすい。フォームのsubmitを入口にして、入力チェックや送信中の表示を整理すると、確認箇所をまとめやすいよ。
- フォーム内と、form属性で関連付けたボタンを探す。
- 送信に使わないボタンへtype="button"を明記する。
- Tabで移動し、EnterやSpaceでも役割どおり動くか見る。
- 入力エラーと送信後の表示まで確かめる。
本番のフォームで試す前に、送信先がテスト環境かを確認してね。ブラウザ上の送信回数だけでなく、通信先で重複処理が起きない設計も別途必要になるよ。
動かしてみよう:ボタンの種類と送信
二つのボタンを押して、フォームの送信回数が変わるか見てみよう。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。