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() はフォームを直接送信するAPIで、submit イベントを発火せず、ブラウザの制約検証も通さずに送信処理へ進めます。
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') などで取得したフォーム要素に対して呼び出します。
submit イベントを発火して preventDefault() で止めてもらうことrequired / pattern など)を自動で走らせることname/value を送信データに含める流れにならない)submit() 自体はレイアウトを変えません。送信後の画面遷移やDOM更新の結果として見た目が変わります。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 イベントが発生しないので、その中で止める設計は効きません。たとえば複数項目を組み合わせた独自判定を通したあと、最後に送信だけ進めたい場面です。ただしブラウザ標準検証を意図的に捨てることになるので、エラー表示の設計を自前で持っている前提で使います。
submit イベントに依存しない既存フォームを後方互換で送る古い実装やライブラリ都合で、送信前イベントを通したくないケースがあります。こうした場合の逃げ道としては機能しますが、保守時に意図が伝わるコメントが欲しい場面です。
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 イベントを通す設計なら、こちらの方が意図に合います。
required や type="email" の標準エラー表示を飛ばしていないかaria-describedby など)が必要ないかrequestSubmit()submit イベントも含みます。checkValidity() / reportValidity()submit() 前に明示的に使うことがあります。FormDatasubmit() と他手段で変わります。novalidatesubmit() はこれとは別に、メソッド側の性質として検証を飛ばします。submit() はフォーム送信を直接始めるsubmit イベントは発生しないname/value が送信データに入る前提は崩れるrequestSubmit() は通常の送信ボタンに近い流れname="submit" / id="submit" はメソッド名衝突の原因になるsubmit() の前に dispatchEvent(new Event('submit')) すれば同じですか?requestSubmit() を使う方が自然です。submit() を使いますか?fetch() で自前実装するなら、そもそもフォームの標準送信を使わないことも多いです。標準送信を残すか、自前通信にするかを先に決めます。form.submit is not a function が出ました。name="submit" または id="submit" のコントロールがないか確認します。衝突している場合は名前変更が最優先です。submit ハンドラが動かないsubmit() を直接呼んでいる。確認:呼び出し箇所。解決:requestSubmit() に切り替えるか、処理の置き場所を見直す。required があるフォームに submit() を使っていないか。解決:requestSubmit() または reportValidity() を使う。form.submit is not a functionsubmit という名前のフォーム部品がある。確認:HTMLの name/id。解決:衝突する名前を避ける。submit() で送っている。確認:Network または受信データ。解決:requestSubmit(submitter) を使う。requestSubmit()submit()submit イベントに寄せている」→ submit() は避けるsubmit is not a function」→ フォーム部品の name/id を確認