fn
押されたキーと正規表現の一致に基づいて、コールバック関数のトリガーを処理する関数でjquerysオブジェクトを拡張できます
単一のキーの正規表現一致をサポートする前に、同様の回答を書きましたが、複数のキーをサポートするために少し変更しました。
$.fn.selectedKey = (function () {
var keys = "";
var last = "";
var key = "";
return function (cb, data) {
def.call(data, {
ctrlKey: 2, //0: musn't be pressed, 1: must be pressed, 2: both.
altKey: 2, // "
invert: 0, //inverts the filter
filter: /.*/, // A Regular Expression, or a String with a Regular Expression
preventDefault: false //Set to true to prevent Default.
}); //Sets the default Data for the values used,
function validate(e) {
var exp = new RegExp(e.data.filter.replace(/\\\\(\d)/g, String.fromCharCode("$1"))); //Creates a new RegExp from a String to e.g. allow "\2" to match the keyCode 2
var c = !! (e.data.ctrlKey ^ e.ctrlKey ^ 1 > 0); //c == true if the above stated conditions are met e.g Ctrl Key Pressed and `ctrlKey == 1` -> true
var a = !! (e.data.altKey ^ e.altKey ^ 1 > 0); //e.g Alt Key Pressed and `altKey == 0` -> false
//console.log(keys,exp,c,a)
return (exp.test(keys) && (c && a)); //Returns the validation Result
}
function def(obj) { //a minimal helper for default values
for (var prop in obj) {
this[prop] = this[prop] || obj[prop];
}
}
this.keypress(data, function (e) {
key = e.char = String.fromCharCode(e.keyCode || e.which); //Converts the pressed key to a String
keys += ( !! ~ (keys.indexOf(key))) ? "" : key;
key = key["to" + (e.shiftKey ? "Upper" : "Lower") + "Case"]();
keys = keys["to" + (e.shiftKey ? "Upper" : "Lower") + "Case"](); //case handling
if (e.data.preventDefault) e.preventDefault();
if ((validate(e) != e.data.invert) && keys != last) {
cb(e);
last = keys;
//Calls the callback function if the conditions are met
}
});
if (!this.data("keyupBound")) {
this.keyup(data, function (e) {
key = e.char = String.fromCharCode(e.keyCode || e.which); //Converts
var t = keys.toLowerCase()
.split("");
t.splice(t.indexOf(e.char), 1);
keys = t.join("");
last = keys;
});
this.data("keyupBound", true);
}
};
})();
$("body").selectedKey(function (e) {
console.log("All lower characters, Numbers and 'A': " + e.char);
}, {
filter: "^[a-z]|[0-9]|A$",
ctrlKey: 2,
altKey: 2
});
$("body").selectedKey(function (e) {
console.log("KeyCode 2 " + e.char); // Ctrl + b
}, {
filter: "\\2",
ctrlKey: 1,
altKey: 2
});
filter:/.{4,5}/
たとえば、同時に押された4〜5個のキーでトリガーすることもできます
たとえば、これは A + S + D が押されたときにトリガーされます
$("body").selectedKey(function (e) {
console.log("ASD has been pressed"); // Ctrl + b
}, {
filter: "^ASD$",
ctrlKey: 2,
altKey: 2
});
JSBinでの実際の例を次に示します。
メモを編集します。検証が true と評価された場合、キーを押し続けると継続的にトリガーされる問題を
修正しました Edit2:last
変数が正しく使用されていない問題を修正しました...