jQuery でファンクションキーやバックスペースキーを無効化する制御

2014/02/01

まず JavaScript の処理としてキー入力イベントは keydown から取得します。入力したキーによって、コード値を取得することができます。そして処理を無効化するためには false を返却します。

これは、キーボードからの入力を制御するための基礎知識です。次のページで基本部分を詳しく説明しているので、参考にしてください。

jQuery でキーボード入力をキャンセル(無効化)する方法
Web システムや Web サイト上で、キーボードからの入力を制御する方法は次の通りです。キー入力イベントをキャッチする 処理を実行させずキャンセルする...

目次

ファンクションキーを制御する

各ファンクションキーと割り当てられたキーコードの関係は次の通りです。

キーF1F2F3F4F5F6
コード112113114115116117
キーF7F8F9F10F11F12
コード118119120121122123

全てのファンクションキーを制御するならば 112 ~ 123 のコードに対して無効化にする処理を実装します。ただ F7F10 は、半角カナ変換や、日本語入力からのアルファベット変換に用いられるため、制御すると利便性が失われます。これらのキーは制限を掛ける必要性がないので、キー制御の対象から外してしまいましょう。

以下のサンプルでは、F1F6 F11 F12 キーの入力を制御するプログラムになっています。

jQuery でファンクションキーを制御
$(function(){
  //------------------------
  // jQueryキー制御サンプル
  // return値falseによりキーキャンセル
  //------------------------
  $(document).keydown(function(event){
    // クリックされたキーのコード
    var keyCode = event.keyCode;

    // ファンクションキーを制御する
    // 制限を掛けたくない場合は対象から外す
    if(keyCode == 112 // F1キーの制御
    	|| keyCode == 113 // F2キーの制御
    	|| keyCode == 114 // F3キーの制御
    	|| keyCode == 115 // F4キーの制御
    	|| keyCode == 116 // F5キーの制御
    	|| keyCode == 117 // F6キーの制御
    	|| keyCode == 122 // F11キーの制御
    	|| keyCode == 123 // F12キーの制御
      )
    {
      return false;
    }
  });
});

Ctrl + N を制御する

Web システムを構築する場合、同一セッションで別ウィンドウが立ち上がることで登録・更新処理がややこしくなることがあります。そのため新規ウィンドウを立ち上げる Ctrl + N も制御の対象にしたほうが望ましいケースがあります。

ファンクションの場合は単一のキーでしたが、Ctrl キーとの組み合わせで制限することも可能です。また AltShift についても同様です。

event オブジェクトから、これらのキーが押下されているか true・false で判断できるので、特定キーとの組み合わせで制御していきます。

同一セッションで同じウィンドウが表示されるのは IE のみ

ここで紹介する Ctrl + N の制御が必要になるのは Internet Explorer のみです。

Chrome や Edge 等の新しいブラウザは、Ctrl + N で空のウィンドウが表示されますが、IE に限り同じ URL で画面が展開されてしまいます。(いわゆる複写のような状態になります。)

なお、以下のプログラムは Chrome では正常に制御しきれないので、予めご了承ください。

jQuery で Ctrl + N を制御
$(function(){
  //------------------------
  // jQueryキー制御サンプル
  // return値falseによりキーキャンセル
  //------------------------
  $(document).keydown(function(event){
    // クリックされたキーのコード
    var keyCode = event.keyCode;
    // Ctrlキーがクリックされたか (true or false)
    var ctrlClick = event.ctrlKey;

    // Ctrl + Nを制御する
    if(ctrlClick && keyCode == 78){
      return false;
    }
  });
});

バックスペースキーを制御する

バックスペースキーは前のページに戻る機能を持っています。もし直前の画面へ遷移しても問題なければ制御は不要です。

バックスペースのキー制御は注意が必要

バックスペースキーの主な役割は、入力文字の削除に使われます。よって、これまでと同様にキーコードのみで制御すると、文字が消せない自体に陥ります。

そこで、テキストボックス・テキストエリアにおいては制御を外さなくてはいけません。更に、制御を外しても disabled 属性や readonly 属性が付与されていると、前の画面に戻ってしまいます。

つまり、これらの条件をまとめると、テキストボックス・テキストエリアは「入力可能な場合に限りバックスペースキーの入力を許容し、それ以外は全て制御」となります。

また、バックスペースキー以外にも Alt + で前画面へ戻ってしまうので、これらはセットで制御するようにしましょう。

以下のサンプルでは、全てを考慮したプログラムになっています。

バックスペースキーを制御
$(function(){
  //------------------------
  // jQueryキー制御サンプル
  // return値falseによりキーキャンセル
  //------------------------
  $(document).keydown(function(event){
    // クリックされたキーのコード
    var keyCode = event.keyCode;
    // Ctrlキーがクリックされたか (true or false)
    var ctrlClick = event.ctrlKey;
    // Altキーがクリックされたか (true or false)
    var altClick = event.altKey;
    // キーイベントが発生した対象のオブジェクト
    var obj = event.target;

    // バックスペースキーを制御する
    if(keyCode == 8){
      // テキストボックス/テキストエリアを制御する
      if((obj.tagName == "INPUT" && obj.type == "TEXT")
      	  || obj.tagName == "TEXTAREA"){
        // 入力できる場合は制御しない
        if(!obj.readOnly && !obj.disabled){
          return true;
        }
      }
      return false;
    }

    // Alt + ←→を制御する
    if(altClick && (keyCode == 37 || keyCode == 39){
      return false;
    }
  });
});

まとめ

上記に挙げたサンプルは、一部だけ利用することはないため、最後に全てをまとめたサンプルコードを用意しておきます。

各キー制御
$(function(){
  //------------------------
  // jQueryキー制御サンプル
  // return値falseによりキーキャンセル
  //------------------------
  $(document).keydown(function(event){
    // クリックされたキーのコード
    var keyCode = event.keyCode;
    // Ctrlキーがクリックされたか (true or false)
    var ctrlClick = event.ctrlKey;
    // Altキーがクリックされたか (true or false)
    var altClick = event.altKey;
    // キーイベントが発生した対象のオブジェクト
    var obj = event.target;

    // ファンクションキーを制御する
    // 制限を掛けたくない場合は対象から外す
    if(keyCode == 112 // F1キーの制御
    	|| keyCode == 113 // F2キーの制御
    	|| keyCode == 114 // F3キーの制御
    	|| keyCode == 115 // F4キーの制御
    	|| keyCode == 116 // F5キーの制御
    	|| keyCode == 117 // F6キーの制御
    	|| keyCode == 122 // F11キーの制御
    	|| keyCode == 123 // F12キーの制御
      )
    {
      return false;
    }

    // バックスペースキーを制御する
    if(keyCode == 8){
      // テキストボックス/テキストエリアを制御する
      if((obj.tagName == "INPUT" && obj.type == "TEXT")
      	  || obj.tagName == "TEXTAREA"){
        // 入力できる場合は制御しない
        if(!obj.readOnly && !obj.disabled){
          return true;
        }
      }
      return false;
    }

    // Alt + ←を制御する
    if(altClick && (keyCode == 37 || keyCode == 39){
      return false;
    }

    // Ctrl + Nを制御する
    if(ctrlClick && keyCode == 78){
      return false;
    }
  });
});

少々冗長なコードになっていますが、ここでは可読性を考慮して記しているので、こちらをベースに改造していただければと思います。

以上、jQuery で各種キー入力を制御する方法でした。

最新の更新情報は、Twitter、Facebook、Freedly にてお届け!

NJ-CLUCKER RSS

このブログの運営者

NJ

気力・体力勝負なシステム業界のエンジニアを経て、個人事業主として独立。Web サイト運営、動画制作など活動の場を広げています。

このブログでは、困ってたどり着いた人に、分かりやすく答えを提供できるように心掛けています。更新情報は、Twitter や Facebook ページを参照ください。フォローお待ちしています。

Facebook ページ NJ-CLUCKER
このブログが役に立ったら
「いいね!」お願いします

サイト内検索