2012-05-01 10 views
8

Grundsätzlich bin ich jQuery Hotkeys plugin von Herrn Resig mit Verknüpfungen zu erfassen und zu behandeln wie ctrl+o etc ...jQuery Hotkeys ... nicht so global

OK, vielleicht tun uderstand ich nicht das Konzept, aber ich war unter dem Eindruck, dass eine ctrl+o ausgelöst überall innerhalb des Dokuments wird von einem Dokument Hotkey-Handler erfasst werden.

Zum Beispiel arbeitet der folgende Code in der Regel ...

jQuery(document).bind('keydown', 'ctrl+o', fn); 

aber es scheitert kläglich, wenn der Benutzer den Hotkey auslöst, wenn innerhalb eines Eingabefeldes ein.

Es funktioniert nur, wenn ich wie folgt vorgehen:

jQuery('body, input').bind('keydown', 'ctrl+o', fn); 

, die für meine Gesundheit ist ziemlich schlecht, da es sich um ist die verfluchten Handler jedes Mal Bindung ein neues Eingabefeld auf das DOM hinzugefügt. Schlimmer noch, ich habe keine Ahnung, an was ich bei komplexen Widgets wie CodeMirror binden soll.

Weiß ich nicht, wenn mein Problem einen Sinn ergibt, vielleicht benutze ich den falschen Ansatz? Ich habe auch versucht, auf die folgenden Objekte zu binden, aber es hat nicht funktioniert: window, document, body, div[contains the whole page]

NB: Sie können try it out here.

+0

vielleicht können Sie das 'on()' hier verwenden? also wird es mit jedem Input funktionieren, der jemals hinzugefügt wurde. Oder fehlt mir etwas? –

+0

@Topener Ich möchte nicht * nur * an alle * aktuellen * Eingänge binden, aber auch an alle * zukünftigen * Eingänge. Die Schönheit des Hinzufügens von Ereignissen auf diese Weise besteht darin, dass Sie keine globalen Variablen benötigen, um Ihre Ereignisbehandlungsfunktionen zu enthalten, Sie tun dies nur einmal, wenn dies erforderlich ist. – Christian

+0

Aber der Punkt hier ist nicht über mich die Ereignisse hinzufügen, sondern die Hotkey-Funktionalität sollte es selbst tun. Ich meine, das ist der Punkt eines Hotkeys .... Drücken von 'Strg + s' im Netbeans-Editor erzeugt den gleichen Effekt, es in netbeans Projektliste (als Beispiel) zu tun. – Christian

Antwort

6

Dies ist eigentlich Funktionalität des Plugins bestimmt:

// Don't fire in text-accepting inputs that we didn't directly bind to 
if (this !== event.target && (/textarea|select/i.test(event.target.nodeName) || 
    event.target.type === "text")) { 
    return; 
} 
+0

Nun, um ehrlich zu sein, weiß ich nicht, wie ich mein Problem beheben kann, ohne diesen Code zu ändern :( – Christian

+0

Ich nehme an, ich könnte eine Option weitergeben, um die Funktion zu deaktivieren ... dann einen Patch an Resigs ... – Christian

+0

Ja, ich sehe keinen Weg drumherum, ohne das Plugin irgendwie zu modifizieren –

1

Ja, JqueryHotkeys kläglich versagt, wenn der Benutzer den Hotkey, wenn innerhalb eines Eingabefeld auslöst.

Alternativ, als ich durchsucht habe ich herausgefunden shortcut.js, die ähnliche Funktionalität wie die Jquery-Hotkeys bietet.

Wichtig es hat auch eine Option zum Aktivieren oder Deaktivieren der "benutzerdefinierten Tastenkombination Funktion" in einem Eingabefeld.