← エラー辞典に戻る

HTML

required属性が効かない(フォームバリデーション)

送信のしかたがバリデーションを通っていない

こんな症状

required属性を付けたのに空欄のまま送信できてしまう。HTMLのバリデーションは「submitによる送信」のときだけ発動する、というのがポイントだよ。

まず試す

送信ボタンを type=submit にする。JSから送るなら form.submit() ではなく form.requestSubmit() を使う。

html
<form id="f">
  <input name="email" required>
  <button type="submit">送信</button>
</form>

これで直らなければ、下の「自分のケース」を確認。

🔍 自分のケースはどれ?

  • type=button + form.submit() で送っている
    → form.submit() はバリデーションをスキップする。type=submit にするか requestSubmit() を使う。
  • input が form の外にある
    → input を form の中に入れる。
  • form に novalidate が付いている
    → novalidate 属性を外す。

なぜ起きる?

ブラウザのバリデーション(required・pattern・type="email"など)は、<form>がsubmitで送信されるときにだけ発動するよ。効かない原因は4つ。(1) inputが<form>タグの外にある。 (2) ボタンが type="button" になっていて、JavaScriptで form.submit() を呼んでいる——form.submit() はバリデーションを完全にスキップするんだ。 (3) formタグに novalidate 属性が付いている。 (4) JSのsubmitイベントで preventDefault() してから独自送信している。

✕ エラーが起きるコード
<form id="f">
  <input name="email" required>
  <button type="button" onclick="document.getElementById('f').submit()">送信</button>
</form>
<!-- form.submit() はバリデーションをスキップして送信してしまう -->
✓ 直したコード
<form id="f">
  <input name="email" required>
  <button type="submit">送信</button>
</form>
<!-- JSから送る場合は requestSubmit() を使う -->
<script>
  // document.getElementById("f").requestSubmit();
</script>

✅ 直ったか確認

空欄のまま送信ボタンを押して、ブラウザの「このフィールドを入力してください」が出ればOK。

🆘 まだ直らないときは

手動でチェックしたいときは form.reportValidity() を呼ぶとエラー表示付きで検証できる。

Q&Aで質問する →

この解決法は役立ちましたか?

🔗 関連するエラー

🔗 別カテゴリの関連エラー

📖 この問題を学べるレッスン

HTMLレッスン5:フォームを作ろうで根本から理解する →

✏️ 手を動かして練習

このテーマの図解ドリルで実際に書いて確認する →

📝 関連ブログ記事

📖 関連する用語

🚀 HTMLレッスン5:フォームを作ろうで根本解決しよう!

このエラーの背景にある仕組みを、手を動かしながら学べるレッスンがあります。完全無料・登録不要。

HTMLレッスン5:フォームを作ろうへ →

❓ 関連するQ&A