Witam
Zdaje sobie sprawę, że istnieją gotowce w tej kwestii, ale robię to do szkoły i w ostateczności chcę z nich korzystać. Moje podejście jest trochę inne, toporne, ale nie wiem dlaczego skrypt działa tylko pod ff i operą...
Może mam fuksa, że w ogóle to działa, ale może jednak da się go przerobić by działało w całej reszcie...
Poprawiłem nie co skrypt, teraz działa, aletylko w przypadku liter i to po dodaniu funkcji toUpperChar()
W innym przypadku kody znaku w zmiennych triggerKeyCode i charCode różnią się, tak samo jeśli użyje znaku innego niż litery alfabetu, np '[', wtedy skrypt nigdzie nie działa, kody zwracane przez charCodeAt() i evt.keyCode też różnią się. Jeśli skrypt działa to dla odmiany tylko w FF/Safari. O co tutaj chodzi?
(function($) {
$.fn.trim = function(value) {
while (value.indexOf(' ') == 0)
value = value.slice(1, value.length);
while (value.lastIndexOf(' ') == value.length - 1)
value = value.slice(0, value.length - 1);
return value;
}
var trim = $.fn.trim;
$.fn.hotkeys = function(shortCut, settings) {
if (shortCut === undefined || typeof shortCut !== 'string' || trim(shortCut).lenght == 0)
throw new Error('Argument missing - shortCut');
var settings = $.extend({}, $.fn.hotkeys.defaultSettings, settings);
var assistKey = '';
var triggerKeyCode = 0;
var keyListener = this;
keyListener.attr('tabIndex', -1).css('outline', 0);
setKeysFromShortCutIfValid(shortCut);
keyListener.keydown(function(evt) {
console.log(evt.keyCode);
if (checkIfAssistKeyIsPressed(evt, assistKey)) {
var charCode = evt.which || evt.keyCode;
if (charCode == triggerKeyCode)
settings.doAction();
}
});
function setKeysFromShortCutIfValid(shortCut) {
shortCut = trim(shortCut);
var separatorIdx = shortCut.indexOf(settings.keySeparator);
if (separatorIdx == -1) throw new Error('Incorrect shortcut string format');
assistKey = trim(shortCut.slice(0, separatorIdx));
var triggerKeyName = trim(shortCut.slice(separatorIdx+1, shortCut.length)).toUpperCase();
if (triggerKeyName.length > 1) throw new Error('Trigger key must be only a single char');
triggerKeyCode = triggerKeyName.charCodeAt(0);
}
function checkIfAssistKeyIsPressed(evt, assistKeyName) {
var evt = evt.originalEvent;
switch (assistKeyName) {
case 'alt': if (evt.altKey) return true;
case 'ctrl': if (evt.ctrlKey) return true;
case 'shift': if (evt.shiftKey) return true;
default: return false;
}
}
return this;
}
$.fn.hotkeys.defaultSettings = {
keySeparator : '+',
doAction: function(evt) {
alert('sdsadsad');
}
}
})(jQuery);