【JavaScript】バックスペースキーを無効化する方法

「Backspaceキーを押すとページが戻ってしまうのを防ぎたい」という理由で、バックスペースキーの無効化を探している方は多いです。しかし結論から言うと、現在のブラウザではこの目的での無効化はほとんど不要です。

さらに、よく紹介される「ページ全体でBackspaceを止める」コードは入力欄の文字まで消せなくする有害なコードです。この記事では、現状を踏まえたうえで、本当に必要な場合の安全な方法と、そもそもの目的(入力内容を守る)を達成する別の手段を解説します。

この記事の結論:現代ブラウザはBackspaceでページが戻らないため、無効化は基本不要です。どうしても必要な場合も、ページ全体で一律に止めてはいけません(入力欄のBackspace削除が壊れます)。入力欄(input・textarea・contenteditable)を除外して止めるか、入力内容を守りたいだけなら beforeunload を使います。
スポンサーリンク

そもそも今は無効化が不要

かつてはBackspaceキーで「ブラウザの戻る」が発生し、フォーム入力中に誤って押すとページが戻って入力内容が消える事故がありました。しかし、Chrome(2016年〜)・Edge・Firefox(2021年〜)などの現代ブラウザは、デフォルトでBackspaceによるページ移動を廃止しています。

そのため、「戻るのを防ぐためにBackspaceを無効化する」必要は基本的にありません。ナビゲーション(戻る操作)そのものを制御したい場合は、Backspaceいじりではなくブラウザの戻るボタンを無効化する方法のように History API で扱うのが正攻法です。

やってはいけない:ページ全体で一律に無効化

古い記事でよく見かける次のコードは絶対に避けてくださいdocument 全体でBackspaceを止めるため、すべての入力欄で文字を削除できなくなります

NG:全Backspaceを止める(入力欄が壊れる)
// このコードは input や textarea の削除まで奪うので使わない
document.addEventListener("keydown", (event) => {
  if (event.key === "Backspace") {
    event.preventDefault();
  }
});
なぜダメか:Backspaceは入力欄では「1文字削除」という基本操作です。これを奪うと、ユーザーは打ち間違いを直せなくなり、フォームがまともに使えなくなります。無効化するなら、必ず入力欄を除外しなければなりません。

どうしても必要なら:入力欄を除外して無効化

レガシーブラウザ対応などでBackspaceの「戻る」だけを止めたい場合は、フォーカスが入力欄にないときだけ無効化します。input・textarea・編集可能要素(contenteditable)を除外するのがポイントです。

安全版:入力欄の外でだけBackspaceを止める
document.addEventListener("keydown", (event) => {
  if (event.key !== "Backspace") return;

  const el = event.target;
  const isEditable =
    el.tagName === "INPUT" ||
    el.tagName === "TEXTAREA" ||
    el.isContentEditable;

  // 入力欄の外で押されたBackspaceだけ無効化する
  if (!isEditable) {
    event.preventDefault();
  }
});

これで入力欄の削除は守られ、それ以外の場所でのBackspaceだけが無効になります。event.key の扱いや keyCode(非推奨)との違いはキーボード入力を取得する方法で解説しています。

補足:厳密には、読み取り専用(readonly)や無効化(disabled)のinput でも昔は戻る挙動が起きました。気になる場合は el.readOnly / el.disabled も「編集不可」として扱い、除外条件に加えてください。

入力内容を守りたいなら beforeunload を使う

そもそもの目的が「うっかりページを離れて入力内容が消えるのを防ぎたい」なら、Backspaceを止めるより beforeunload イベントが正解です。Backspaceに限らず、戻るボタン・タブを閉じる・リロードなどあらゆる離脱で確認ダイアログを出せます。

JavaScript:未保存なら離脱時に確認
let formIsDirty = false;

// 入力があったら「変更あり」にする
document.querySelector("form").addEventListener("input", () => {
  formIsDirty = true;
});

window.addEventListener("beforeunload", (event) => {
  if (formIsDirty) {
    event.preventDefault();      // 離脱前に確認ダイアログを表示
    event.returnValue = "";      // 一部ブラウザで必要
  }
});

こちらのほうが、Backspaceだけを塞ぐより確実にデータ消失を防げます。フォーム入力の監視はEnterキーでフォーム送信を無効化する方法のようなキー制御と組み合わせると、より堅牢なフォームになります。

アクセシビリティへの注意

キー無効化は慎重に:キー操作の無効化は、キーボードだけで操作するユーザーや支援技術の妨げになることがあります。Backspaceのような基本キーはとくに影響が大きいため、本当に必要な場面だけ・最小限の範囲で適用してください。多くの場合、無効化せずに beforeunload で守るほうが親切です。

よくある質問(FAQ)

QJavaScriptでバックスペースキーを無効にするには?
Akeydown イベントで event.key === "Backspace" のときに event.preventDefault() を呼びます。ただしそのままだと入力欄の削除まで無効になるため、input・textarea・contenteditable を除外する条件分岐が必須です。
Qバックスペースでブラウザバックされないようにしたいのですが?
A現代のブラウザ(Chrome・Edge・Firefoxなど)は、デフォルトでBackspaceによるページ移動を廃止しています。そのため、この目的での無効化は基本的に不要です。古いブラウザ対応が必要な場合のみ、入力欄を除外したうえで preventDefault() を実装します。
Q入力した内容が消えるのを防ぐ一番確実な方法は?
ABackspaceを止めるのではなく、beforeunload イベントで離脱時に確認ダイアログを出す方法が確実です。戻るボタン・タブを閉じる・リロードなど、Backspace以外の離脱もまとめて防げます。
Q特定のキーを無効にする際の注意点は?
Aアクセシビリティに影響する可能性があります。キーボード操作のユーザーや支援技術の妨げにならないよう、本当に必要な場合のみ、最小限のキー・最小限の範囲で無効化してください。

まとめ

現代のブラウザはBackspaceでページが戻らないため、「戻るのを防ぐためのBackspace無効化」は基本的に不要です。よくある「ページ全体で一律に止める」コードは、入力欄の文字削除まで壊す有害なコードなので使ってはいけません。

どうしても必要なら、input・textarea・contenteditable を除外して入力欄の外でだけ無効化します。そして本来の目的が「入力内容を守ること」なら、beforeunload を使うのがもっとも確実で親切な方法です。