sid/js/shortcut.js

146 lines
3.0 KiB
JavaScript
Executable File

/* Retourne le keyCode correspondant à la chaîne
*
* @param keyStore enchaînement de touches sous forme de string
* @param handler function qui s'éxécute lors du raccourci
*
* return keyCode le code de la touche correspondante
*/
function strToKeyCode(str){
// on enregistre le keyCode du premier caractère
var keyCode = str.toUpperCase().charCodeAt(0);
// s'il s'agit d'un caractère uniquement (entre "a" et "z")
if( str.length == 1 && keyCode >= 65 && keyCode <= 90 )
return keyCode; // on retourne le keyCode associé
else
switch( str ){
case 'ctrl': return 17; break;
case 'maj': return 16; break;
case 'alt': return 18; break;
case 'tab': return 9; break;
}
return null;
}
var shortcutList = []; // contient les combinaisons de touches
var shortcutStep = []; // contient l'avancée d'un raccourcis
/* Gestion des raccourcis claviers
*
* @param keyStore enchaînement de touches sous forme de string
* @param handler function qui s'éxécute lors du raccourci
*
*/
function Shortcut(keyStore, handler){
var splittedString = keyStore.toLowerCase().split('+'), // découpe la chaîne (en minuscule) par "+"
splittedKeyCode = new Array(); // contiendra les keyCode de chaque touche
// pour chaque touche, on récupère le keyCode
for( var i = 0 ; i < splittedString.length ; i++ )
splittedKeyCode[i] = strToKeyCode( splittedString[i] ); // on enregistre le keyCode correspondant
// on ajout à la liste globale
eventIndex = shortcutList.length;
shortcutList.push( splittedKeyCode );
// on initialise l'avancement
shortcutStep[eventIndex] = 0;
// creation de la fonction d'évènement
shortcutList[eventIndex].push( function(e, k, f, h){ /* k<keyCode> ; f<eventIndex> ; h<handler()> */
// console.log(f);
// on cherche l'avancée
var step = shortcutStep[f];
// on regarde si la touche est bonne
if( shortcutList[f][step] == k ){ // si c'est la touche suivante
if( step >= shortcutList[f].length-2 ){ // si c'était la dernière touche
// on initialise le tableau
for( var i = 0 ; i < shortcutStep[f].length ; i++ )
shortcutStep[f][i] = 0;
// console.log('ok');
e.preventDefault();
h(); // EXECUTION DE : handler();
}else // sinon on incrémente l'avancée
shortcutStep[f]++;
}else // si c'est pas la bonne touche, on réinitialise le tableau
shortcutStep[f] = 0;
});
// création de l'évènement
window.addEventListener(
'keydown',
function(e){ shortcutList[eventIndex][shortcutList[eventIndex].length-1](e, e.keyCode, eventIndex, handler); },
false
);
}
/* quand on lâche une touche, tout les raccourcis s'effacent */
window.addEventListener('keyup', function(){
for( var i = 0 ; i < shortcutStep.length ; i++ )
shortcutStep[i] = 0;
}, false);
/*** UTILISATION ***/
// Shortcut(
// 'ctrl+s',
// function(){ alert('sauvegardé'); }
// );
//