【JavaScript】Enterキーでフォーム送信を無効化する方法

複数の入力欄があるフォームで、入力途中に Enterキーを押したら意図せず送信されてしまった、という経験はよくあります。これは仕様どおりの動作(暗黙的な送信)ですが、JavaScriptで止めることができます。

ただし、単純に「フォーム全体でEnterを無効化」すると、textareaの改行や日本語入力の変換確定まで巻き込んで壊れます。この記事では、そうした落とし穴を避けた正しい無効化の方法を解説します。

この記事の結論:keydown イベントで event.key === "Enter" を検知し preventDefault() します。その際 textareaとIME変換中のEnterは除外するのが必須。検索ボックスなどEnter送信が自然なフォームでは無効化しない(アクセシビリティに配慮)ようにします。
スポンサーリンク

なぜEnterでフォームが送信されるのか

HTMLのフォームには「暗黙的な送信(implicit submission)」という仕組みがあります。1行テキスト入力(<input type="text"> など)にフォーカスがある状態でEnterを押すと、フォームが自動的に送信されます。これは標準の動作です。

この送信はEnterキーのデフォルト動作なので、Enterが押された瞬間にそれを preventDefault() で打ち消せば止められます。

keydownでEnter送信を無効化する(textarea除外)

キー操作の検知には、廃止予定の keypress ではなく keydown を使います。そのうえで、textarea(改行が必要)と送信ボタン、IME変換中のEnterを除外します。

JavaScript:Enter送信だけを止める
const form = document.getElementById("myForm");

form.addEventListener("keydown", (event) => {
  if (
    event.key === "Enter" &&
    !event.isComposing &&  // IME変換確定のEnterは無視
    event.target.matches("input:not([type=submit]):not([type=button])")
  ) {
    event.preventDefault(); // 暗黙の送信を止める
  }
});

ポイントは event.target.matches("input:not(...)")1行テキスト入力に対象を絞っている点です。これにより textarea の改行や、送信ボタンを押した(Enterで押下した)ときの送信はそのまま動きます。event.key の詳しい扱いはキーボード入力を取得する方法を参照してください。

keypressは使わない:古い記事では keypress を使う例が多いですが、keypress廃止予定(deprecated)で一部キーで発火しないなど不安定です。キー操作の検知は keydown を使ってください。

特定の入力欄だけ無効化する

フォーム全体ではなく、特定の1欄だけEnter送信を止めたい場合は、その要素に直接リスナーを付けます。

JavaScript:指定した入力欄だけ無効化
const keyword = document.getElementById("keyword");

keyword.addEventListener("keydown", (event) => {
  if (event.key === "Enter" && !event.isComposing) {
    event.preventDefault();
  }
});

Enterで次の入力欄へ移動する(無効化の代替)

「送信はさせたくないが、Enterで次の欄に進めたい」というニーズも多いです。その場合は送信を止めたうえで、次のフォーム要素に focus() します。

JavaScript:Enterで次の欄へフォーカス移動
form.addEventListener("keydown", (event) => {
  if (event.key !== "Enter" || event.isComposing) return;
  if (event.target.tagName === "TEXTAREA") return; // textareaは改行を優先

  event.preventDefault();

  const fields = [...form.querySelectorAll("input, select")];
  const i = fields.indexOf(event.target);
  if (i >= 0 && i < fields.length - 1) {
    fields[i + 1].focus(); // 次の入力欄へ
  }
});

注意:むやみに全フォームで無効化しない

アクセシビリティに配慮:Enterキーでの送信は、検索ボックスや1項目だけのフォームではユーザーが期待する自然な操作であり、キーボード操作の重要な手段です。すべてのフォームで一律に無効化すると、かえって使いにくくなります。Enter無効化は「複数項目があり途中送信を防ぎたいフォーム」など、本当に必要な場面に絞って適用しましょう。

フォーム入力をリアルタイムに扱う実装はフォーム入力をリアルタイムで監視する方法、Enter以外のキー制御はバックスペースキーを無効化する方法も参考になります。

よくある質問(FAQ)

QJavaScriptでEnterキーによるフォーム送信を無効にするには?
Akeydown イベントで event.key === "Enter" かつ event.target.tagName !== "TEXTAREA" のときに event.preventDefault() を呼びます。textareaでは改行が必要なため除外し、廃止予定の keypress は使いません。
Q特定の入力フィールドでのみEnterを無効にするには?
A対象の要素に直接 keydown リスナーを付け、Enterキー時に preventDefault() します。フォーム全体ではなく個別に制御できるため、textareaなど他の要素に影響しません。
QEnterで次のフィールドにフォーカスを移動するには?
AEnterのデフォルト動作を preventDefault() で止めたうえで、次のフォーム要素に focus() します。querySelectorAll("input, select") で順序を取得し、現在のインデックス+1の要素へ移動します。
Q日本語入力の変換確定でEnterを押したときも止まってしまいます。
AIME変換中のEnterは event.isComposingtrue になります。条件に !event.isComposing を加えて、変換確定のEnterを除外してください。これで入力中の誤作動を防げます。

まとめ

Enterキーでのフォーム送信は、keydown イベントで検知して preventDefault() すれば無効化できます。その際 textareaの改行・IME変換確定のEnter・送信ボタンを巻き込まないよう、input:not([type=submit])isComposing で対象を絞るのが重要です。

廃止予定の keypress は使わず keydown を使い、Enter送信が自然なフォームでは無効化しない、というアクセシビリティへの配慮も忘れないようにしましょう。「送信は止めて次の欄へ進めたい」なら focus() での移動が便利です。