Hallo beatovich,
besser als mit einem Dictionary-Lookup wirst Du es wohl nicht hinbekommen.
Was Du mit ev.target==ta prüfst, ist mir nicht klar. Da fehlt was im geposteten Code, würde ich vermuten.
Frage könnte sein, ob die Wartungsfreundlichkeit hinreichend ist. Das String-Matching von den Bindings zu den Functions gefällt mir nicht so gut. Wie wäre es hiermit:
var keyFunctions = {
"OPEN HELP 1": function(evt) {
alert("Help me if you can!")
},
encodeHtml: function(evt) {
alert("ENCODE_HTML")
}
};
var bindings={
// ....
"4:h": keyFunctions["OPEN HELP 1"], // so für Handler die kein gültiger JS Name sind
"5:e": keyFunctions.encodeHtml, // oder so
};
Dann musst Du nach Identifikation einer relevanten Taste nicht mehr in ein zweites Dictionary einsteigen, sondern hast die passende Function direkt am Wickel. Du könntest damit auch mehrere KeyHandler-Container unterstützen.
Das setzt natürlich voraus, dass alle Key-Funktionen vor Aufbau der Bindings bereit stehen und dass Du nicht dynamisch einem KeyFunction-Namen eine andere Function zuweisen willst (was aber Spagetti-Deluxe wäre).
Du könntest einen Hander auch mit call aufrufen und ihm das Event-Objekt oder das Event-Target als this übergeben. Oder als einfachen Parameter. Ggf. braucht ein Keyhandler Informationen aus dem Event.
Die Frage ist auch, ob Dir dieses Konstrukt hinreicht. Wie legst Du fest, dass das Handling einer Tastenkombination nur an die Handlerfunktion Xyz gehen soll, wenn sich das Event-Target innerhalb eines bestimmten Containers befindet? Möglicherweise hat Ctrl+Q ja im Container A eine andere Semantik als im Container B. Oder möchtest Du das im Einzelfall behandeln und eine Verteilerfunktion im Binding eintragen? Wäre vermutlich die performanteste Lösung...
Es könnte noch eine Überlegung sein, zweistufig zu agieren, d.h. zunächst mit ev.key einzusteigen und die Prüfung auf Modifier nur zu machen, wenn für die Taste etwas hinterlegt ist. Aber ich glaube nicht, dass das lohnt. Du wirst nicht schnell genug Tasten drücken können, um einen Computer mit dem von Dir angedachten Code ins Schwitzen zu bringen. Selbst ein kleines Atom-Öfchen oder Brombeerchen nicht.
Eine andere Frage, die mir gerade einfällt, ist Modularisierung. Angenommen, du hast mehrere sauber gekapselte JS-Module, die auf der Seite laufen. Jedes interessiert sich für ein paar Tasten. D.h. eigentlich müsste jedes Modul den KeyController als Parameter bekommen und sich dort registrieren können. Eine statische, manuell gepflegte Tabelle mit genau einem Handler pro Keycode kann dann zu starr sein, abgesehen davon dass die Handler-Methoden eventuell gar nicht vom Modul publiziert werden.
Rolf
sumpsi - posui - clusi