JavaScriptで特定キーの入力をトリガーとして使用する方法まとめ

JavaScriptでキーボード入力をトリガーとして使用するJS
この記事は約19分で読めます。

※本記事のコンテンツは、利用目的を問わずご活用いただけます。実務経験10000時間以上のエンジニアが監修しており、基礎知識があれば初心者にも理解していただけるように、常に解説内容のわかりやすさや記事の品質に注力しております。不具合・分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。(理解できない部分などの個別相談も無償で承っております)
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●キーボード入力の基礎知識

キーボード入力は、ユーザーとWebアプリケーションやゲームとのインタラクションにおいて重要な役割を果たします。

JavaScriptでキーボード入力を扱うためには、まずその基礎知識を身につける必要があります。

○キーボードイベントの種類

JavaScriptでは、キーボード入力に関連するイベントが主に3つあります。

  1. keydown:キーが押された瞬間に発生するイベント
  2. keyup:押されたキーが離された瞬間に発生するイベント
  3. keypress:キーが押され、文字が入力された瞬間に発生するイベント

これらのイベントを適切に使い分けることで、キーボード入力に応じた処理を実装できます。

○キーコードとは?

キーコードは、キーボード上の各キーを識別するための番号です。

JavaScriptでは、イベントオブジェクトの keyCode プロパティや which プロパティを使ってキーコードを取得できます。

例えば、Enterキーのキーコードは13、スペースキーのキーコードは32です。

キーコードを使うことで、特定のキーが押されたかどうかを判定できます。

○サンプルコード1:キー入力の検知

では、実際にJavaScriptでキー入力を検知してみましょう。

次のサンプルコードは、keydownイベントを使ってキー入力を検知し、押されたキーのキーコードをコンソールに出力します。

document.addEventListener('keydown', function(event) {
  console.log('押されたキーのキーコード:', event.keyCode);
});

このコードを実行すると、キーが押されるたびにコンソールにキーコードが表示されます。

例えば、Enterキーを押すと次のような出力が得られます。

押されたキーのキーコード: 13

このように、keydownイベントとキーコードを組み合わせることで、キー入力を検知し、押されたキーを特定できます。

キーボード入力の基礎知識を理解したところで、次は特定のキーをトリガーとして使う方法について見ていきましょう。

JavaScriptでは、キーコードを使ってEnterキーや方向キーなどの特定のキーを判定し、それをトリガーとして様々な処理を実行できます。

●特定のキーをトリガーとして使う

キーボード入力の基礎を押さえたところで、今度は特定のキーをトリガーとして使う方法について見ていきましょう。

JavaScriptでは、キーコードを使ってEnterキーや方向キーなどの特定のキーを判定し、それをトリガーとして様々な処理を実行できます。

○サンプルコード2:Enterキーによる送信

例えば、Enterキーを押したときにフォームを送信したい場合などによく使われるテクニックです。

次のサンプルコードでは、keydownイベントを使ってEnterキー(キーコード13)の入力を検知し、フォームを送信する処理を実装しています。

document.getElementById('myForm').addEventListener('keydown', function(event) {
  if (event.keyCode === 13) {
    event.preventDefault(); // デフォルトのEnterキーの動作をキャンセル
    document.getElementById('myForm').submit(); // フォームを送信
  }
});

このコードを実行すると、フォーム内でEnterキーを押すことでフォームが送信されます。

event.preventDefault()を呼び出すことで、Enterキーのデフォルトの動作(フォームの送信)をキャンセルし、代わりにsubmit()メソッドを呼び出してフォームを送信しています。

○サンプルコード3:方向キーによる移動

ゲームなどでは、方向キーを使ってキャラクターを移動させることがよくあります。

次のサンプルコードでは、方向キーの入力に応じてキャラクターの位置を更新する処理を実装しています。

let characterX = 0;
let characterY = 0;

document.addEventListener('keydown', function(event) {
  switch (event.keyCode) {
    case 37: // 左矢印キー
      characterX -= 10;
      break;
    case 38: // 上矢印キー
      characterY -= 10;
      break;
    case 39: // 右矢印キー
      characterX += 10;
      break;
    case 40: // 下矢印キー
      characterY += 10;
      break;
  }

  document.getElementById('character').style.left = characterX + 'px';
  document.getElementById('character').style.top = characterY + 'px';
});

このコードでは、switch文を使って方向キーのキーコード(37、38、39、40)を判定し、それぞれの方向に応じてキャラクターの位置(characterXcharacterY)を更新しています。

更新後の位置は、style.leftstyle.topプロパティを使ってキャラクターの要素に反映されます。

実行結果として、方向キーを押すとキャラクターがその方向に10ピクセルずつ移動します。

このように、特定のキーをトリガーとして使うことで、インタラクティブな操作を実現できます。

○サンプルコード4:複数キーの同時押し判定

ゲームなどでは、複数のキーを同時に押す操作が必要になることがあります。

次のサンプルコードでは、Shiftキーとスペースキーが同時に押されたかどうかを判定する処理を実装しています。

let isShiftPressed = false;

document.addEventListener('keydown', function(event) {
  if (event.keyCode === 16) { // Shiftキー
    isShiftPressed = true;
  }

  if (event.keyCode === 32 && isShiftPressed) { // スペースキーとShiftキーが同時に押された
    console.log('Shiftキーとスペースキーが同時に押されました!');
  }
});

document.addEventListener('keyup', function(event) {
  if (event.keyCode === 16) { // Shiftキー
    isShiftPressed = false;
  }
});

このコードでは、isShiftPressed変数を使ってShiftキーが押されているかどうかを管理しています。

Shiftキーが押されたときにisShiftPressedをtrueに設定し、離されたときにfalseに戻します。

そして、keydownイベントでスペースキー(キーコード32)が押された際に、isShiftPressedがtrueであればShiftキーとスペースキーが同時に押されたと判定し、メッセージを出力します。

実行結果として、ShiftキーとスペースキーをPCで同時に押すと、コンソールに「Shiftキーとスペースキーが同時に押されました!」というメッセージが表示されます。

このように、複数のキーの同時押しを判定することで、より高度なキーボード操作を実現できます。

○サンプルコード5:キーの長押し検知

キーの長押しを検知することで、キーを押し続けている間、特定の処理を継続的に実行できます。

例えば、ゲームでキャラクターを連続的に移動させたり、オートファイアー機能を実装したりする際に役立ちます。

次のサンプルコードでは、スペースキーの長押しを検知し、長押ししている間、一定間隔で処理を実行する方法を表しています。

let isSpacePressed = false;
let intervalId;

document.addEventListener('keydown', function(event) {
  if (event.keyCode === 32 && !isSpacePressed) { // スペースキーが押された
    isSpacePressed = true;
    intervalId = setInterval(function() {
      console.log('スペースキーが長押しされています!');
    }, 500); // 500ミリ秒間隔で処理を実行
  }
});

document.addEventListener('keyup', function(event) {
  if (event.keyCode === 32) { // スペースキーが離された
    isSpacePressed = false;
    clearInterval(intervalId); // 処理の実行を停止
  }
});

このコードでは、isSpacePressed変数を使ってスペースキーが押されているかどうかを管理しています。

スペースキーが押されたときにisSpacePressedをtrueに設定し、setInterval関数を使って500ミリ秒(0.5秒)間隔で処理を実行します。

スペースキーが離されたときには、isSpacePressedをfalseに戻し、clearInterval関数を呼び出して処理の実行を停止します。

実行結果として、スペースキーを長押しすると、コンソールに「スペースキーが長押しされています!」というメッセージが500ミリ秒ごとに表示されます。

スペースキーを離すと、メッセージの表示が停止します。

●キーボード入力の応用テクニック

JavaScriptでのキーボード入力は、Webアプリケーションやゲームに様々な可能性をもたらします。

ここからは、キーボード入力の応用テクニックについて見ていきましょう。

キー入力の無効化、カスタムキーボードの実装、ゲームでのキー入力活用例など、より高度なテクニックを学ぶことで、JavaScriptでのキーボード入力の可能性を広げていきましょう。

○サンプルコード6:キー入力の無効化

状況によっては、特定のキーの入力を無効化したい場合があります。

例えば、フォームの入力中に、Enterキーによる送信を防ぎたいときなどです。

次のサンプルコードでは、keydownイベントを使ってキー入力を無効化する方法を表しています。

document.addEventListener('keydown', function(event) {
  if (event.keyCode === 13) { // Enterキーの入力を無効化
    event.preventDefault();
  }
});

このコードでは、keydownイベントでevent.preventDefault()を呼び出すことで、Enterキー(キーコード13)の入力を無効化しています。

preventDefault()メソッドは、イベントのデフォルトの動作をキャンセルするために使用されます。

実行結果として、Enterキーを押してもフォームが送信されなくなります。

このように、特定のキーの入力を無効化することで、意図しない動作を防ぐことができます。

○サンプルコード7:カスタムキーボードの実装

独自のキーボードレイアウトを実装したい場合、カスタムキーボードを作成することができます。

例えば、ゲームで特殊な操作に対応するキーを割り当てたり、言語固有の文字を入力するためのキーボードを作成したりする場合などです。

次のサンプルコードでは、カスタムキーボードを実装する方法を示しています。

<div id="keyboard">
  <button data-key="65">A</button>
  <button data-key="66">B</button>
  <button data-key="67">C</button>
</div>
const keys = document.querySelectorAll('#keyboard button');

keys.forEach(function(key) {
  key.addEventListener('click', function() {
    const keyCode = this.getAttribute('data-key');
    console.log('押されたキー:', keyCode);
    // キーに対応する処理を実行する
  });
});

このコードでは、HTMLで<button>要素を使ってカスタムキーボードのキーを定義しています。

各キーにはdata-key属性を使ってキーコードを割り当てています。

JavaScriptでは、querySelectorAll()を使ってキーの要素を取得し、それぞれのキーにclickイベントリスナーを追加しています。

キーがクリックされたときに、data-key属性からキーコードを取得し、それに対応する処理を実行します。

実行結果として、カスタムキーボードのキーをクリックすると、対応するキーコードがコンソールに出力されます。

このように、カスタムキーボードを実装することで、独自のキー配置や機能を持つキーボードを作成できます。

○サンプルコード8:ゲームでのキー入力活用例

ゲームでは、キーボード入力がプレイヤーの操作に欠かせない要素となります。

キャラクターの移動や攻撃、メニューの選択などにキー入力を活用することで、よりインタラクティブなゲーム体験を実装できます。

次のサンプルコードでは、ゲームでのキー入力の活用例を表しています。

let playerX = 0;
let playerY = 0;
let isFireKeyPressed = false;

document.addEventListener('keydown', function(event) {
  switch (event.keyCode) {
    case 37: // 左矢印キー
      playerX -= 5;
      break;
    case 38: // 上矢印キー
      playerY -= 5;
      break;
    case 39: // 右矢印キー
      playerX += 5;
      break;
    case 40: // 下矢印キー
      playerY += 5;
      break;
    case 32: // スペースキー
      isFireKeyPressed = true;
      break;
  }
});

document.addEventListener('keyup', function(event) {
  if (event.keyCode === 32) {
    isFireKeyPressed = false;
  }
});

function gameLoop() {
  // プレイヤーの位置を更新
  document.getElementById('player').style.left = playerX + 'px';
  document.getElementById('player').style.top = playerY + 'px';

  // 発射キーが押されているかを確認し、弾を発射
  if (isFireKeyPressed) {
    fireWeapon();
  }

  requestAnimationFrame(gameLoop);
}

function fireWeapon() {
  console.log('弾を発射!');
  // 弾の発射処理を実装する
}

gameLoop();

このコードでは、方向キーを使ってプレイヤーを移動させ、スペースキーを使って弾を発射するゲームの例を示しています。

keydownイベントでは、方向キーが押されたときにプレイヤーの位置を更新し、スペースキーが押されたときにisFireKeyPressedフラグをtrueに設定します。

keyupイベントでは、スペースキーが離されたときにisFireKeyPressedフラグをfalseに戻します。

gameLoop関数では、プレイヤーの位置を更新し、isFireKeyPressedフラグを確認して弾を発射します。

requestAnimationFrameを使って、ゲームループを継続的に実行します。

実行結果として、方向キーでプレイヤーが移動し、スペースキーを押すと弾が発射されます(コンソールに「弾を発射!」と出力されます)。

○サンプルコード9:キー入力のログ記録

キー入力のログを記録することで、ユーザーがどのようなキー操作を行ったかを分析したり、デバッグの際に役立てたりすることができます。

次のサンプルコードでは、キー入力のログを記録する方法を示しています。

const keyLog = [];

document.addEventListener('keydown', function(event) {
  const timestamp = new Date().toISOString();
  const key = event.key;
  const keyCode = event.keyCode;

  const logEntry = {
    timestamp: timestamp,
    key: key,
    keyCode: keyCode
  };

  keyLog.push(logEntry);
  console.log('キー入力ログ:', logEntry);
});

// ログをサーバーに送信する関数
function sendLogToServer() {
  // サーバーにログを送信する処理を実装する
  console.log('キー入力ログをサーバーに送信しました:', keyLog);
  keyLog.length = 0; // ログをクリアする
}

// 一定時間ごとにログを送信する
setInterval(sendLogToServer, 5000);

このコードでは、keydownイベントが発生するたびに、タイムスタンプ、キー、キーコードを含むログエントリーを作成し、keyLog配列に追加します。

ログエントリーはコンソールにも出力されます。

sendLogToServer関数は、一定時間ごとに呼び出され、キー入力ログをサーバーに送信する処理を実装します。

この例では、5000ミリ秒(5秒)ごとにログを送信し、送信後にログをクリアしています。

実行結果として、キーが押されるたびにログエントリーがコンソールに出力され、5秒ごとにログがサーバーに送信されます。

●よくあるエラーと対処法

JavaScriptでキーボード入力を扱う際に、初心者がぶつかりがちなエラーがいくつかあります。

ここでは、そのようなエラーとその対処法について見ていきましょう。

キーボード入力に関する問題にスムーズに対処できるようになることで、開発の生産性を向上させることができます。

○「keydown」イベントが発火しない

キー入力を検知するためにkeydownイベントを使用しているにもかかわらず、イベントが発火しないというエラーに遭遇することがあります。

このエラーは、いくつかの原因が考えられます。

まず、イベントリスナーが正しく設定されているかを確認しましょう。

addEventListenerメソッドを使って、keydownイベントにリスナーを登録する必要があります。

document.addEventListener('keydown', function(event) {
  // キー入力の処理
});

また、イベントリスナーを設定する要素が適切であるかを確認してください。

documentオブジェクトにイベントリスナーを設定すれば、ページ全体でのキー入力を検知できます。

特定の要素でキー入力を検知したい場合は、その要素に対してイベントリスナーを設定します。

const input = document.getElementById('myInput');
input.addEventListener('keydown', function(event) {
  // キー入力の処理
});

さらに、キー入力を検知したい要素がフォーカスを持っているかを確認してください。

フォーカスがない要素ではキー入力が検知されない場合があります。

この点を確認し、適切に修正することで、keydownイベントが発火しない問題を解決できます。

○キーコードの非推奨警告への対処

これまでのサンプルコードでは、event.keyCodeを使ってキーコードを取得していました。

しかし、keyCodeプロパティは非推奨となり、将来的に削除される可能性があります。

代わりに、event.keyプロパティを使用することが推奨されています。

event.keyは、押されたキーの文字列表現を提供します。

document.addEventListener('keydown', function(event) {
  console.log('押されたキー:', event.key);
});

上記のコードでは、event.keyを使ってキーの文字列表現を取得しています。

例えば、Enterキーが押された場合は'Enter'、スペースキーが押された場合は' '(空白文字)が出力されます。

event.keyを使用することで、キーコードに依存せずにキー入力を処理できます。

ただし、event.keyはキーの文字列表現を提供するため、キーコードとは異なる値が返される場合があることに注意してください。

必要に応じて、event.keyevent.keyCodeを組み合わせて使用することで、より柔軟なキー入力の処理が可能になります。

○ブラウザ間の互換性問題

キーボード入力を扱う際に、ブラウザ間の互換性の問題に直面することがあります。

特に、古いブラウザではキーボードイベントの実装に違いがある場合があります。

例えば、keyCodeプロパティやwhichプロパティの値がブラウザによって異なる場合があります。

また、一部のブラウザではevent.keyプロパティがサポートされていない可能性があります。

これらの互換性の問題に対処するためには、ブラウザ間の差異を吸収するコードを書く必要があります。

document.addEventListener('keydown', function(event) {
  const keyCode = event.keyCode || event.which;
  const key = event.key || String.fromCharCode(keyCode);

  console.log('押されたキー:', key);
});

上記のコードでは、event.keyCodeevent.whichの両方を確認し、サポートされている方の値を使用しています。

また、event.keyがサポートされていない場合は、String.fromCharCodeを使ってキーコードから文字列を取得しています。

このように、ブラウザ間の互換性を考慮したコードを書くことで、より多くのブラウザで一貫したキーボード入力の処理が可能になります。

ただし、ブラウザの互換性は常に変化しているため、最新の情報を確認し、必要に応じてコードを更新することが重要です。

まとめ

JavaScriptでキーボード入力を扱う方法について、基礎知識から応用まで幅広く解説しました。

本記事で得た知識を活かして、JavaScriptでのキーボード入力を自在に扱い、ユーザーフレンドリーで魅力的なWebアプリケーションやゲームを開発していきましょう。

常に新しい技術や手法を学び、エンジニアとしてのスキルを磨いていくことが大切です。