KeyboardJS
- HTML5 APIs
- UI ライブラリ
- テスト支援
- ドキュメント
- コード品質ツール
- バリデータ
- キー入力支援
- テストダブル
- ハイブリッドアプリケーション
- 継続的インテグレーション
- KeyboardJSとは
- 主な機能
- 基本的な使い方
- その他の操作
- 日本語ロケールへの対応
KeyboardJSとは
単一のキー入力や、キーの組み合わせによる入力(Ctrl+S 等)に対して、操作の割り当てを容易に実装することができるライブラリです。
主な機能
- キー名やキーコンボを指定してハンドラを登録し、押された指定された条件に一致するとハンドラが実行される
- キーボードロケールの追加・削除
- キーの追加・削除
- マクロの追加・削除
- アクティブ(現在操作されたキー)なキー名の取得
- KeyboardJSを有効または無効の切り替え
- キーコンボ文字列をキー文字列を持つ配列に変換
- キー文字列を持つ配列をキーコンボ文字列に変換
基本的な使い方
KeyboardJS.on()でキーコンボに対してバインドするハンドラを登録します。
KeyboardJS.on(String keyCombo, Function onDownCallback, Function onUpCallback)
パラメータ名 | 型 | 説明 |
---|---|---|
keyCombo | String | キーコンボ(キーコンボの詳細はこちらを参照) |
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キーが一緒に押された場合の処理を登録しています。
// ev: KeyboardEvent
// key: ["ctrl", "f"]
// keycombo: "ctrl + f"
}, function(ev, key, keycombo) {
// ev: KeyboardEvent
// key: ["ctrl", "f"]
// keycombo: "ctrl + f"
});
キーコンボとは
押されるキーの条件文です。
パターンは以下の通りです。
キーコンボの条件指定に使用する文字列は、
- > (大なり)
- + (プラス)
- , (カンマ)
があります。
例:
条件 | 意味 |
---|---|
a | aのキーが押されたか |
a , b | aまたはbのキーが押されたか |
a + b | aとbのキーが同時に押されか |
a > b | aが押された状態でのbキーを押されたか |
a + b, c + d | aとbのキーが同時におされた、またはcとdのキーが同時に押されたか |
a + b > c + d | aとbのキーが同時におしながら、cとdのキーを同時におされたか |
その他の操作
アクティブなキー名を取得する
KeyboardJS.activeKeys()
Ctrl+Aが押された場合
console.log(KeyboardJS.activeKeys()); // ["ctrl", "a"]
}
※ キーが押されているときにこのメソッドを実行する必要があります。(直近でアクティブだったキー名を返す訳ではない)
キーコンボに割り当てたハンドラを除去する
KeyboardJS.clear(String keyCombo)
...
}, function() {
...
});
KeyboardJS.clear("a"); // KeyboardJS.on("a")のハンドラが動作しなくなる。
キーに紐づくハンドラを全て除去する
KeyboardJS.clear.key(String key)
...
}, function() {
...
});
KeyboardJS.on("ctrl + a", function() { //
...
}, function() {
...
});
KeyboardJS.clear.key("a"); // shift + a, ctrl + aのハンドラが動作しなくなる
ロケールを登録する
KeyboardJS.locale.register(String localeName, Object localeDefinition)
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", "$"]],
...
]
};
mapとmacrosをキーにもつオブジェクトで定義します。
mapには、キーにキーコード、値にキー名が列挙された配列を持つオブジェクトを指定します。
macrosには、キーコンボとキー名の配列を持つ配列を指定します。
ロケールを変更する
KeyboardJS.locale(String localeName)
map: { "29": ["muhenkan", "無変換"] },
macros: [ ['shift + ^', ["tilde", "チルダ", "~"]] ]
};
KeyboardJS.locale.register("jp", jpLocale);
KeyboardJS.clear.key("jp"); // ロケールがusからjpに変更される
マクロを登録する
KeyboardJS.macro(String keyCombo, Array keyNames)
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.on("ctrl + v", function(ev, key, keycombo) { // CTRLキーとVキーが同時押されても動作しなくなる
...
}, function(ev, key, keycombo) {
...
});
キーコードに紐づくキー名を取得する
KeyboardJS.key.name(Number keyCode)
KeyboardJS.key.name(100); // ["numfour", "num4"]
※ このメソッドは、ロケール定義のmapに設定されている値からキー名を返します。
キー名に紐づくキーコードを取得する
KeyboardJS.key.code(Number keyCode)
KeyboardJS.key.name("a"); // 65
KeyboardJS.key.name("$"); // false
KeyboardJS.key.name("shift + 1"); // false
※ このメソッドは、ロケール定義のmapに設定されている値からキーコードを返します。
文字列を解析してキーコンボを持つ配列に変換する
KeyboardJS.combo.parse(String keyCombo)
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"], ["c", "d"] ] ]); // "a + b > c + d"
KeyboardJSの動作を有効化または無効化する
KeyboardJS.enable()
KeyboardJS.on()に登録したハンドラの動作を有効にします。
デフォルトはこの状態です。
KeyboardJS.disable()
KeyboardJS.on()に登録したハンドラの動作を無効にします。
日本語ロケールへの対応
KeyboardJSのデフォルトロケールはus(英語キーボード)になっており、日本語のロケールは用意されておりません。
そのため、日本語のロケールをユーザが定義する必要があります。
以下のコードは、日本語(109キーボード)に対応するためのロケール定義の一例です。
この定義をKeyboardJS.setLocale()に指定して、日本語キーボード用のロケールを追加します。
"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", "ハテナ", "?"]]
]
};