JavaScript
この記事では「JavaScript」について、基本の意味と使い方を初心者向けにやさしく説明します。
The JavaScript submit() method submits a form directly, bypassing submit events and constraint validation, so it is useful when you intentionally want low-level submission behavior.
submit()
submit() はフォームを直接送信するAPIで、submit イベントを発火せず、ブラウザの制約検証も通さずに送信処理へ進めます。
- Table Of Contents
このページでできるようになること
submit()が「何を起こす/何を起こさない」かを説明できるrequestSubmit()や実際の送信ボタンとの違いを判断できるsubmitイベントが動かない理由で詰まったときに原因を切り分けられるrequiredなどのバリデーションを飛ばす挙動を理解して安全に使い分けられるname="submit"/id="submit"による衝突を回避できる- 試験で出やすい「イベントが起きるか」「検証が走るか」のひっかけを見抜ける
まずは直感:submit() って何?
ざっくり言うと、submit() は「送信ボタンを押したことにする」のではなく、「フォーム送信処理を直接始める」ためのメソッドです。
- 送信は進む:フォームの送信処理に入る
submitイベントは出ない:addEventListener('submit', ...)は動かない- バリデーションも飛ばす:
requiredやpatternの検証が止めてくれない
最小デモ:まず動かす
下のデモでは、空の必須入力欄に対して submit() / requestSubmit() / 実際の送信ボタン を試せます。
空欄のまま form.submit() を押すと、submit イベントなし・検証なしで送信先の iframe に進みます。requestSubmit() や通常ボタンは、空欄ならブラウザ検証で止まります。
JavaScript
const form = document.querySelector('#demoForm');
form.submit();
最短の型はこれだけですが、実務では「本当にイベントと検証を飛ばしてよいか」を先に確認します。
正確な定義(仕様に沿った説明)
何のために存在するか
submit() は HTMLFormElement のメソッドで、フォームを直接送信するために使います。送信ボタンのクリックを再現するAPIではなく、送信処理そのものを始めるAPIです。
何に適用されるか(対象)
submit() は <form> 要素に対応する HTMLFormElement で使います。つまり document.querySelector('form') などで取得したフォーム要素に対して呼び出します。
できること / できないこと(制約)
- できること
-
- フォーム送信処理をただちに開始する
- カスタム送信前処理を通さず、低レベルに送信だけ進める
- JavaScript側で条件が揃ったときだけ明示的に送信する
- できないこと(重要)
-
submitイベントを発火してpreventDefault()で止めてもらうこと- ブラウザの制約検証(
required/patternなど)を自動で走らせること - どの送信ボタンが押されたかをそのまま反映すること(送信ボタンの
name/valueを送信データに含める流れにならない)
影響範囲(レイアウト/描画/ユーザー操作/アクセシビリティ)
- レイアウト
submit()自体はレイアウトを変えません。送信後の画面遷移やDOM更新の結果として見た目が変わります。- 描画
- メソッドを呼んだ瞬間に何か表示が変わるわけではなく、送信処理・レスポンス・JavaScript側の後続処理で変わります。
- ユーザー操作
- ユーザーが送信ボタンを押した流れとは異なるため、送信前確認や計測処理を
submitイベントに寄せていると、そこを素通りします。 - アクセシビリティ
- ブラウザ標準のエラーメッセージやフォーカス移動を使う設計では、
submit()にするとそれらを飛ばしやすくなります。入力不備を伝える導線を壊していないか確認が必要です。
基本の書き方(最短の型)
最小サンプル(コピペ用)
HTML
<form id="loginForm" action="/login" method="post">
<input type="email" name="email">
<input type="password" name="password">
</form>
JavaScript
const loginForm = document.querySelector('#loginForm');
loginForm.submit();
よく使う判断
- 標準の検証と
submitイベントを使いたい form.requestSubmit()を優先します。- 送信ボタンが押された扱いにしたい
- 実際の送信ボタンをクリックするか、
requestSubmit(submitter)を使います。 - あえて検証やイベントを飛ばしたい
form.submit()を使います。理由が明確なときだけに絞ると安全です。
どこに書くか(実務の位置づけ)
実務では、クリックハンドラや送信前分岐の最後で呼ぶことがあります。ただし「なんとなく submit」だと事故りやすいので、検証・計測・二重送信防止との関係を整理した上で置きます。
仕様として押さえるポイント(初心者が事故りやすい所)
- 戻り値は?
submit()の戻り値はundefinedです。dispatchEvent()のようにtrue/falseを返してくれるAPIではありません。submitイベントは起きる?- 起きません。
form.addEventListener('submit', ...)による処理、onsubmit、その中のpreventDefault()も通りません。 - 制約検証は走る?
- 走りません。
required/minlength/patternなどがあっても、その場で止めてくれません。 - 送信ボタンの値は送られる?
- 通常の送信ボタン経由ではないため、どのボタンが押されたかを表す送信ボタンの
name/valueは送信データに含まれません。 name="submit"で何が起きる?- フォーム内コントロールの
nameまたはidがsubmitだと、フォームのsubmitメソッド名と衝突してform.submit is not a functionになることがあります。 - 非同期に見える?
- メソッド呼び出し自体は同期的に始まりますが、結果としての遷移や通信完了は別です。試験では「イベントを待っているわけではない」点がひっかけになります。
よくある勘違い・混同ポイント
form.submit()
送信処理を直接始めます。submit イベントなし、制約検証なし。
form.requestSubmit()
送信ボタン相当の流れで送信をリクエストします。submit イベントあり、制約検証あり。
送信ボタンのクリック
ユーザー操作に近い自然な流れです。どの送信ボタンかも反映されます。
submit()= 送信ボタンを押したのと同じ- 同じではありません。見た目は似ていても、
submitイベントと制約検証の有無が違います。 checkValidity()した後なら完全に同じ- 近づきますが同じではありません。送信ボタン由来の
name/value、submitter情報、submitイベント経由の処理は別です。 preventDefault()で止められるsubmit()が直接走る場合、そもそもsubmitイベントが発生しないので、その中で止める設計は効きません。- 送信できれば UX は同じ
- 違います。ブラウザ標準の入力エラー表示、フォーカス移動、支援技術との相性が変わるので、フォーム体験は大きく変わります。
実務でよくある使用例(制作会社の現場を想定)
JavaScript側で独自検証を完了させた後にだけ送る
たとえば複数項目を組み合わせた独自判定を通したあと、最後に送信だけ進めたい場面です。ただしブラウザ標準検証を意図的に捨てることになるので、エラー表示の設計を自前で持っている前提で使います。
submit イベントに依存しない既存フォームを後方互換で送る
古い実装やライブラリ都合で、送信前イベントを通したくないケースがあります。こうした場合の逃げ道としては機能しますが、保守時に意図が伝わるコメントが欲しい場面です。
自動送信風UIでも、本当は requestSubmit() の方が自然なことが多い
検索フォームや絞り込みUIで「条件が変わったらすぐ送る」を実装したいとき、submit() を選ぶと検証や分析イベントが抜けやすいです。まずは requestSubmit() を試し、それで足りない理由があるときだけ submit() に下げます。
事故りやすい例と回避策
悪い例:submit イベントが動く前提で submit() している
JavaScript
form.addEventListener('submit', (event) => {
event.preventDefault();
sendAnalytics();
});
form.submit();
この書き方だと sendAnalytics() は実行されません。submit イベント自体が発火しないからです。
良い例:イベントと検証を使いたいなら requestSubmit() にする
JavaScript
form.addEventListener('submit', (event) => {
event.preventDefault();
sendAnalytics();
});
form.requestSubmit();
submit イベントを通す設計なら、こちらの方が意図に合います。
A11y / UX で確認したいこと
requiredやtype="email"の標準エラー表示を飛ばしていないか- エラー時にフォーカスをどこへ戻すか、自前実装があるか
- キーボード操作ユーザーに送信失敗理由が伝わるか
- スクリーンリーダー向けにエラーメッセージの関連付け(
aria-describedbyなど)が必要ないか
関連API・属性との相互作用
requestSubmit()- 送信ボタン相当の流れで送りたいときの第一候補です。制約検証も
submitイベントも含みます。 checkValidity()/reportValidity()- 独自分岐を入れる前に、入力値が妥当かを確認したいときに使います。
submit()前に明示的に使うことがあります。 FormData- 送信前にデータの中身を確認したいときに便利です。ただしどの送信ボタン経由かの差は
submit()と他手段で変わります。 novalidate- フォーム全体で標準検証を外すHTML属性です。
submit()はこれとは別に、メソッド側の性質として検証を飛ばします。
試験で得点できる整理
submit()はフォーム送信を直接始めるsubmitイベントは発生しない- 制約検証は実行されない
- 送信ボタンの
name/valueが送信データに入る前提は崩れる requestSubmit()は通常の送信ボタンに近い流れname="submit"/id="submit"はメソッド名衝突の原因になる
FAQ
submit()の前にdispatchEvent(new Event('submit'))すれば同じですか?- 同じではありません。自分で投げたイベントと、ブラウザのフォーム送信アルゴリズムの流れは一致しません。必要なら
requestSubmit()を使う方が自然です。 - Ajax送信でも
submit()を使いますか? - 送信を
fetch()で自前実装するなら、そもそもフォームの標準送信を使わないことも多いです。標準送信を残すか、自前通信にするかを先に決めます。 form.submit is not a functionが出ました。- フォーム内に
name="submit"またはid="submit"のコントロールがないか確認します。衝突している場合は名前変更が最優先です。
症状早見
- 症状:
submitハンドラが動かない - 原因候補:
submit()を直接呼んでいる。確認:呼び出し箇所。解決:requestSubmit()に切り替えるか、処理の置き場所を見直す。 - 症状:空欄でも送信される
- 原因候補:制約検証を飛ばしている。確認:
requiredがあるフォームにsubmit()を使っていないか。解決:requestSubmit()またはreportValidity()を使う。 - 症状:
form.submit is not a function - 原因候補:
submitという名前のフォーム部品がある。確認:HTMLのname/id。解決:衝突する名前を避ける。 - 症状:押したボタン種別がサーバーに届かない
- 原因候補:送信ボタン経由ではなく
submit()で送っている。確認:Network または受信データ。解決:requestSubmit(submitter)を使う。
まとめ:迷ったときの判断軸
- 「普通の送信ボタンと同じ流れで送りたい」→
requestSubmit() - 「イベント・バリデーションを意図的に飛ばしたい」→
submit() - 「送信前処理を
submitイベントに寄せている」→submit()は避ける - 「
submit is not a function」→ フォーム部品のname/idを確認