Cloudlog/js/jquery.shortkeys.js

92 行
2.2 KiB
JavaScript

jQuery.fn.shortkeys = jQuery.fn.keys = function (obj, settings) {
var el = this;
this.settings = jQuery.extend({
split: "+",
moreKeys: {}
}, settings || {});
this.wackyKeys = { '.': 190, ',': 188, ';': 59, 'Space': 32 };
this.formElements = new Array("input", "select", "textarea", "button");
this.keys = new Array();
this.onFormElement = false;
this.keysDown = new Array();
this.init = function (obj) {
for(x in this.wackyKeys) {
this.wackyKeys[x.toUpperCase()] = this.wackyKeys[x];
}
for(x in obj) {
this.keys.push(x.split(this.settings.split));
}
for(i in this.keys) {
var quickArr = new Array();
for(j in this.keys[i]) {
quickArr.push(this.convertToNumbers(this.keys[i][j].toUpperCase()));
}
quickArr.sort();
this.keys[i] = quickArr;
}
};
this.convertToNumbers = function (inp) {
if (this.wackyKeys[inp] != undefined) {
return this.wackyKeys[inp];
}
return inp.toUpperCase().charCodeAt(0);
};
this.keyAdd = function(keyCode) {
this.keysDown.push(keyCode);
this.keysDown.sort();
};
this.keyRemove = function (keyCode) {
for(i in this.keysDown) {
if(this.keysDown[i] == keyCode) {
this.keysDown.splice(i,1);
}
};
this.keysDown.sort();
};
this.keyTest = function (i) {
if (this.keys[i].length != this.keysDown.length) return false;
for(j in this.keys[i]) {
if(this.keys[i][j] != this.keysDown[j]) {
return false;
}
}
return true;
};
this.keyRemoveAll = function () {
this.keysDown = new Array();
};
this.focused = function (bool) {
this.onFormElement = bool;
}
$(document).keydown(function(e) {
el.keyAdd(e.keyCode);
var i = 0;
for(x in obj) {
if(el.keyTest(i) && !el.onFormElement) {
obj[x]();
return false;
break;
}
i++;
};
});
$(document).keyup(function (e) {
el.keyRemove(e.keyCode);
});
for(x in this.formElements) {
$(this.formElements[x]).focus( function () {
el.focused(true);
});
$(this.formElements[x]).blur( function () {
el.focused(false);
});
}
$(document).focus( function () {
el.keyRemoveAll();
});
this.init(obj);
jQuery.extend(this.wackyKeys, this.settings.moreKeys);
return this;
}