開発者ブログ
HTML5資料室 » KeyboardJS

KeyboardJS

Last modified by mtakeuchi on 2013/09/11, 17:55

KeyboardJSとは

単一のキー入力や、キーの組み合わせによる入力(Ctrl+S 等)に対して、操作の割り当てを容易に実装することができるライブラリです。

主な機能

  • キー名やキーコンボを指定してハンドラを登録し、押された指定された条件に一致するとハンドラが実行される
  • キーボードロケールの追加・削除
  • キーの追加・削除
  • マクロの追加・削除
  • アクティブ(現在操作されたキー)なキー名の取得
  • KeyboardJSを有効または無効の切り替え
  • キーコンボ文字列をキー文字列を持つ配列に変換
  • キー文字列を持つ配列をキーコンボ文字列に変換

基本的な使い方

KeyboardJS.on()でキーコンボに対してバインドするハンドラを登録します。

KeyboardJS.on(String keyCombo, Function onDownCallback, Function onUpCallback)

パラメータ名説明
keyComboStringキーコンボ(キーコンボの詳細はこちらを参照)
onDownCallback(ev, keys, keycombo)Functionキーダウン時に実行されるメソッド
パラメータ
ev: イベントオブジェクト
keys: 現在押されているキー名の配列(KeyboardJS.activeKeys()と同じ値が返ってくる)
keycombo: キーコンボ文字列
onUpCallback(ev, keys, keycombo)Functionキーアップ時に実行されるメソッド
ev: イベントオブジェクト
keys: 現在押されているキー名の配列(KeyboardJS.activeKeys()と同じ値が返ってくる)
keycombo: キーコンボ文字列
onUpCallback(ev, keys, keycombo)Functionキーダウン時に実行されるメソッド

サンプルコード

CTRLキーとFキーが一緒に押された場合の処理を登録しています。

KeyboardJS.on("ctrl + f", function(ev, key, keycombo) {
   // ev: KeyboardEvent
   // key: ["ctrl", "f"]
   // keycombo: "ctrl + f"
}, function(ev, key, keycombo) {
   // ev: KeyboardEvent
   // key: ["ctrl", "f"]
   // keycombo: "ctrl + f"
});

キーコンボとは

押されるキーの条件文です。

パターンは以下の通りです。
キーコンボの条件指定に使用する文字列は、

  •  >  (大なり)
  •  +  (プラス)
  •  ,  (カンマ)

があります。

例:

条件意味
aaのキーが押されたか
a , baまたはbのキーが押されたか
a + baとbのキーが同時に押されか
a > baが押された状態でのbキーを押されたか
a + b, c + daとbのキーが同時におされた、またはcとdのキーが同時に押されたか
a + b > c + daとbのキーが同時におしながら、cとdのキーを同時におされたか

その他の操作

アクティブなキー名を取得する

KeyboardJS.activeKeys()

Ctrl+Aが押された場合

  '{rootElement} keyup': function(context) {
console.log(KeyboardJS.activeKeys()); // ["ctrl", "a"]
  }

※ キーが押されているときにこのメソッドを実行する必要があります。(直近でアクティブだったキー名を返す訳ではない)

キーコンボに割り当てたハンドラを除去する

KeyboardJS.clear(String keyCombo)

   KeyboardJS.on("a", function() {
        ...
   }, function() {
        ...
   });

   KeyboardJS.clear("a"); // KeyboardJS.on("a")のハンドラが動作しなくなる。

キーに紐づくハンドラを全て除去する

KeyboardJS.clear.key(String key)

   KeyboardJS.on("shift + a", function() {
        ...
   }, function() {
        ...
   });

   KeyboardJS.on("ctrl + a", function() { //
       ...
   }, function() {
        ...
   });

   KeyboardJS.clear.key("a"); // shift + a, ctrl + aのハンドラが動作しなくなる

ロケールを登録する

KeyboardJS.locale.register(String localeName, Object localeDefinition)

  var jpLocale = {
        map: { "29": ["muhenkan", "無変換"] },
        macros: [ ['shift + ^', ["tilde", "チルダ", "~"]] ]
   };
   KeyboardJS.locale.register("jp", jpLocale); // jpとしてロケールを定義する

ロケール定義の書き方

register()の第二引数に渡すオブジェクトは、以下のフォーマットで定義します。

{
 "map": {
   "3": ["cancel"],
   "8": ["backspace"],
   "9": ["tab"],
   
    ...
  },
 "macros": [
    ['shift + `', ["tilde", "~"]],
    ['shift + 1', ["exclamation", "exclamationpoint", "!"]],
    ['shift + 2', ["at", "@"]],
    ['shift + 3', ["number", "#"]],
    ['shift + 4', ["dollar", "dollars", "dollarsign", "$"]],
   
    ...
  ]
};

mapmacrosをキーにもつオブジェクトで定義します。
mapには、キーにキーコード、値にキー名が列挙された配列を持つオブジェクトを指定します。
macrosには、キーコンボキー名の配列を持つ配列を指定します。

ロケールを変更する

KeyboardJS.locale(String localeName)

  var jpLocale = {
        map: { "29": ["muhenkan", "無変換"] },
        macros: [ ['shift + ^', ["tilde", "チルダ", "~"]] ]
   };
   KeyboardJS.locale.register("jp", jpLocale);


   KeyboardJS.clear.key("jp"); // ロケールがusからjpに変更される

マクロを登録する

KeyboardJS.macro(String keyCombo, Array keyNames)

   KeyboardJS.macro('ctrl + v', ['paste', '貼り付け']);

   KeyboardJS.on("ctrl + v", function(ev, key, keycombo) { // CTRLキーとVキーが同時に押されると実行される
       // ev: KeyboardEvent
       // key: ["ctrl", "v", "paste", "貼り付け"]
       // keycombo: "ctrl + v"
  }, function(ev, key, keycombo) {
       // ev: KeyboardEvent
       // key: ["ctrl", "v", "paste", "貼り付け"]
       // keycombo: "ctrl + v"
  });

マクロを除去する

KeyboardJS.macro.remove(String keyCombo)

   KeyboardJS.macro.remove('ctrl + v');

   KeyboardJS.on("ctrl + v", function(ev, key, keycombo) { // CTRLキーとVキーが同時押されても動作しなくなる
       ...
   }, function(ev, key, keycombo) {
        ...
   });

キーコードに紐づくキー名を取得する

KeyboardJS.key.name(Number keyCode)

KeyboardJS.key.name(42); // ["printscreen"]

KeyboardJS.key.name(100); // ["numfour", "num4"]

※ このメソッドは、ロケール定義のmapに設定されている値からキー名を返します。

キー名に紐づくキーコードを取得する

KeyboardJS.key.code(Number keyCode)

KeyboardJS.key.code("ctrl"); //  17

KeyboardJS.key.name("a"); // 65

KeyboardJS.key.name("$"); // false

KeyboardJS.key.name("shift + 1"); // false

※ このメソッドは、ロケール定義のmapに設定されている値からキーコードを返します。

文字列を解析してキーコンボを持つ配列に変換する

KeyboardJS.combo.parse(String keyCombo)

KeyboardJS.key.code("shift + 1"); //  [ [ ["shift", "1"] ] ]

KeyboardJS.combo.parse('a, b');   //  [ [ ["a"] ], [ ["b"] ] ]

KeyboardJS.combo.parse('a + b > c + d'); // [ [ ["a", "b"], ["c", "d"] ] ]

配列の値を解析してキーコンボ文字列に変換する

KeyboardJS.combo.stringify(Array keyComboArray)

KeyboardJS.combo.stringify([ [["a"]], [["b"]] ]); // "a b"

KeyboardJS.combo.stringify([ [["a"], ["b"]] ]);   // "a > b"

KeyboardJS.combo.stringify([ [ ["a", "b"], ["c", "d"] ] ]);  // "a + b > c + d"

KeyboardJSの動作を有効化または無効化する

KeyboardJS.enable()

KeyboardJS.on()に登録したハンドラの動作を有効にします。
デフォルトはこの状態です。

KeyboardJS.disable()

KeyboardJS.on()に登録したハンドラの動作を無効にします。

日本語ロケールへの対応

KeyboardJSのデフォルトロケールはus(英語キーボード)になっており、日本語のロケールは用意されておりません。
そのため、日本語のロケールをユーザが定義する必要があります。

以下のコードは、日本語(109キーボード)に対応するためのロケール定義の一例です。
この定義をKeyboardJS.setLocale()に指定して、日本語キーボード用のロケールを追加します。

var JP_LOCALE = {
     "map": {
       "3": ["cancel"],
       "8": ["backspace", "バックスペース"],
       "9": ["tab", "タブ"],
       "12": ["clear"],
       "13": ["enter", "エンター"],
       "16": ["shift", "シフト"],
       "17": ["ctrl", "コントロール"],
       "18": ["alt", "menu", "オルト"],
       "19": ["pause", "break"],
       "20": ["capslock"],
       "27": ["escape", "esc", "エスケープ"],
       "28": ["maekouho", "henkan", "tugikouho", "zenkouho", "前候補", "変換", "次候補", "前候補"],
       "29": ["muhenkan", "無変換"],
       "32": ["space", "spacebar", "スペース"],
       "33": ["pageup"],
       "34": ["pagedown"],
       "35": ["end", "エンド"],
       "36": ["home", "ホーム"],
       "37": ["left", "左"],
       "38": ["up", "上"],
       "39": ["right", "右"],
       "40": ["down", "下"],
       "41": ["select"],
       "42": ["printscreen"],
       "43": ["execute"],
       "44": ["snapshot"],
       "45": ["insert", "ins"],
       "46": ["delete", "del"],
       "47": ["help"],
       "91": ["command", "windows", "win", "super", "leftcommand", "leftwindows", "leftwin", "leftsuper"],
       "92": ["command", "windows", "win", "super", "rightcommand", "rightwindows", "rightwin", "rightsuper"],
       "145": ["scrolllock", "scroll"],
       "186": ["colon", "コロン", ":"],
       "187": ["semicolon", "セミコロン", ";"],
       "188": ["comma", "カンマ", ","],
       "189": ["hyphen", "ハイフン", "-"],
       "190": ["period", "ピリオド", "."],
       "191": ["slash", "forwardslash", "/", "スラッシュ"],
       "192": ["at", "atmark", "アットマーク", "@"],
       "219": ["openbracket", "始め角括弧", "["],
       "220": ["yen", "エンマーク", "\\"],
       "226": ["backslash", "バックスラッシュ", "\\"],
       "221": ["closebracket", "終わり角括弧", "]"],
       "222": ["caret", "キャレット", "^"],
       "242": ["katakana", "hiragana", "ro-maji", "カタカナ", "ひらがな", "ローマ字"],
       "243": ["zenkaku", "全角"],
       "244": ["hankaku", "半角"],

       //0-9
       "48": ["zero", "ゼロ", "0"],
       "49": ["one", "イチ", "1"],
       "50": ["two", "ニ", "2"],
       "51": ["three", "サン", "3"],
       "52": ["four", "ヨン", "4"],
       "53": ["five", "ゴ", "5"],
       "54": ["six", "ロク", "6"],
       "55": ["seven", "ナナ", "7"],
       "56": ["eight", "ハチ", "8"],
       "57": ["nine", "キュウ", "9"],

       //numpad
       "96": ["numzero", "num0"],
       "97": ["numone", "num1"],
       "98": ["numtwo", "num2"],
       "99": ["numthree", "num3"],
       "100": ["numfour", "num4"],
       "101": ["numfive", "num5"],
       "102": ["numsix", "num6"],
       "103": ["numseven", "num7"],
       "104": ["numeight", "num8"],
       "105": ["numnine", "num9"],
       "106": ["nummultiply", "num*"],
       "107": ["numadd", "num+"],
       "108": ["numenter"],
       "109": ["numsubtract", "num-"],
       "110": ["numdecimal", "num."],
       "111": ["numdevide", "num/"],
       "144": ["numlock", "num"],

       //function keys
       "112": ["f1"],
       "113": ["f2"],
       "114": ["f3"],
       "115": ["f4"],
       "116": ["f5"],
       "117": ["f6"],
       "118": ["f7"],
       "119": ["f8"],
       "120": ["f9"],
       "121": ["f10"],
       "122": ["f11"],
       "123": ["f12"]
      },
     "macros": [
       //secondary key symbols
       ['shift + ^', ["tilde", "チルダ", "~"]],
        ['shift + 1', ["exclamation", "エクスクラメーション", "ビックリ", "!"]],
        ['shift + 2', ["quotationmark", "ダブルクォート", "\""]],
        ['shift + 3', ["number", "シャープ", "#"]],
        ['shift + 4', ["dollar", "dollars", "dollarsign", "ドルマーク", "$"]],
        ['shift + 5', ["percent", "パーセント", "%"]],
        ['shift + 6', ["ampersand", "and", "アンド", "アンパサンド", "&"]],
        ['shift + 7', ["apostrophe", "singlequote", "シングルクォート", "'"]],
        ['shift + 8', ["openparen", "leftparen", "hajimekakko", "始め括弧", "("]],
        ['shift + 9', ["closeparen", "rightparen", "owarikakko", "終わり括弧", ")"]],
        ['shift + :', ["asterisk", "アスタリスク", "*"]],
        ['shift + at', ["graveaccent", "accentgrave", "アクサングラーブ", "`"]],
        ['shift + backslash', ["underscore", "アンダースコア", "アンダーライン", "_"]],
        ['shift + -', ["equal", "equalsign", "イコール", "="]],
        ['shift + [', ["opencurlybrace", "opencurlybracket", "始め中括弧", "{"]],
        ['shift + ]', ["closecurlybrace", "closecurlybracket", "終わり中括弧", "}"]],
        ['shift + yen', ["verticalbar", "バーティカルバー", "|"]],
        ['shift + ;', ["plus", "プラス", "+"]],
        ['shift + !,', ["openanglebracket", "rightanglebracket", "小なり", "<"]],
        ['shift + comma', ["closeanglebracket", "leftanglebracket", "大なり", ">"]],
        ['shift + /', ["questionmark", "ハテナ", "?"]]
      ]
};

Copyright (C) 2012-2017 NS Solutions Corporation, All Rights Reserved.