はじめに
Enterキーを押すとformが送信されるのを防ぐ。
この実装方法自体は調べればすぐに見つかったのだが、送信される場合とされない場合があったので疑問を感じた。
そこで調べてみると、from
、input
、buttun
といったHTML要素の仕様について、色々と勉強になったので備忘録を書いておく。
やりたいこと
form
で<input type=”text”>
にフォーカスしている時に、Enterキー
を押すと送信されてしまう場合がある。
意図しない送信を防ぐ為、送信ボタンをクリックしたときだけsubmit
するようにする。
実装方法
formタグにonsubmit="return false;"を追加する
以下のような感じに。
<form onsubmit="return false;">
送信ボタンをtype="button"にする
送信ボタンをtype="button"
に変更する。
onclick="submit();
でボタンを押したときだけsubmit
させるようにする。
(input
要素のsubmit
型は、ボタンとして描画される。)
<input type="button" value="送信" onClick="submit();">
フロント側のバリデーションを効かせたい
ただし上記の実装では、input
に指定しているrequired
属性などフロント側のバリデーションは無視して送信されてしまう。
フロント側のバリデーションを効かせたい場合は、以下のようにJavaScriptで制御する。
<script>
function submitAfterValidate() {
if (!form.reportValidity()) {
return false;
} else {
form.submit();
}
}
</script>
// 中略
<input type="button" value="送信" onClick="submitAfterValidate();">
学んだこと備忘録
ここから先は、HTMLのform
関連で学んだことの備忘録。
formのaction属性
action
属性は、どこにデータを送信するかを定義する。
値は相対または絶対URL。
// 絶対URLの場合
<form action="https://example.com">
// 相対URLの場合(同一オリジン上の別のURLに送信する)
<form action="/example">
// 何も指定しなければ、フォームが表示されているページ自身へ送信する
<form>
入力欄でのEnterキー押下で、submitされる場合とされない場合
-
form
内にsubmit
ボタンがある場合は、Enter
キー押下によりsubmit
される。
※submitボタン:<input type="submit">
もしくは<button type="submit">
を指す。
<form>
<input type="text">
<input type="text">
<input type="submit" value="送信">
</form>
-
form
内にsubmit
ボタンが無く、<input type="text">
が1つだけであれば、Enter
キー押下でsubmit
される。
<form>
<input type="text">
<input type="button" value="送信" onClick="submit();">
</form>
-
form
内にsubmit
ボタンが無くても、<input type="text">
が2つ以上あれば、Enter
キー押下でsubmit
されない。
<form>
<input type="text">
<input type="text">
<input type="button" value="送信" onClick="submit();">
</form>
※ただし、form
内にinput
は2つだけど片方がtype='hidden'
だったり、片方がtextarea
の場合はEnter
キー押下でsubmit
される。
暗黙的送信(Implicit submission)
これらの挙動は、暗黙的送信(Implicit submission) という仕様によるものらしい。
https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#implicit-submission
ざっくり言うと、この仕様により、
-
submit
ボタンは無いがフォームのinput
要素が1つだけの場合 - フォームの
input
要素が複数あるが、有効なsubmit
ボタンが存在する場合
は、暗黙的送信が行われるということ。
type属性を省略したbuttonはsubmitボタンになる
ちなみに、button
のtype
属性を省略すると、デフォルトでtype="submit"
になるらしい。
<button>戻る</button>
これも意図しない挙動を引き起こしかねないので、覚えておこうと思う。
さいごに
「Enterキーでformが送信されるのを防ぐ」という解決方法はすぐに見つかったが、やはりもう少し調べると色々勉強になることがあり、意図しない挙動を起こさない為にはきっちり理解することが大事だなと思った。
なぜこれで動くのか?なぜこの挙動になるのか?と、今後も疑問を持って知識を深めていきたい。
参考記事