2013-10-15 6 views
8

Ich benutze ein anderes Textfeld als Proxy für CodeMirror. Ich möchte Funktionen wie closebrackets.js verwenden, die über Tastaturereignisse wie keydown, keypress und keyup aktiviert werden. Ich habe verschiedene Ansätze versucht, diese Ereignisse auslösen, von denen keines verursacht haben Codemirror etwas zu erhalten:Wie kann ich Tastaturereignisse in CodeMirror auslösen?

kc = 219 
e = $.Event 'keydown', { which: kc } 
$(myCodeMirror.getInputField()).trigger e 

funktioniert nicht. Es werden keine Ereignisse ausgelöst.

cmIF = $(myCodeMirror.getInputField()) 

textArea = $('<textarea></textArea>') 
$('body').append textArea 
textArea.keydown (e) -> 
    cmIF.focus() 
    return 

kc = 219 
e = $.Event 'keydown', { which: kc } 
textArea.trigger e 

Der Versuch, Ereignisse aus einem anderen Textbereich weiterzuleiten. Funktioniert nicht. CM nicht Ereignisse werden nicht ausgelöst.

Versuchen, das Ereignis auf jedem Kind von CMs Wrapper auszulösen. Funktioniert nicht. Keine CM-Ereignisse ausgelöst.

Was mache ich hier falsch? Wie kann ich Tastaturereignisse in einer CodeMirror-Instanz auslösen?

Antwort

6

Ich bin mir nicht sicher, ob ich Sie 100% verstehe, aber derzeit definiere ich Tastaturereignisse, wenn ich meine Konfigurationsoptionen für die Codemirror-Instanz definiere.

var cmInstance = CodeMirror(target, { 
    value: myTextArea.value, 
    //other options here perhaps 

    //defining some keyboard shortcuts 
    extraKeys: { 
     "Ctrl-J": "toMatchingTag", 
     "Ctrl-S": function(cm) { 
      saveCode(cm); //function called when 'ctrl+s' is used when instance is in focus 
     }, 
     "F11": function(cm) { 
      toggleFullscreen(cm,true); //function called for full screen mode 
     }, 
     "Esc": function(cm) { 
      toggleFullscreen(cm,false); //function to escape full screen mode 
     } 
    } 
}); 

Beachten Sie, dass diese Funktionen nur ausgelöst werden, wenn die Codemirror-Instanz im Fokus ist. Dann können Sie tun, was Sie in Ihren Funktionen mögen, vielleicht sogar neue Listener hinzufügen, um zu sehen, welche Art von Ereignis aufgetreten ist (?).

Ich hoffe, das hilft.

+1

Sie auf dem richtigen Weg sind, aber ich möchte auf Tasten Ereignis ausgelöst, nicht nur Verknüpfungen. Zum Beispiel feuert CodeMirror ein 'onkeydown'-Ereignis, wenn ich einen Buchstaben oder eine Zahl eintippe. Ich möchte diese Ereignisse auslösen, ohne Zeichen manuell eingeben zu müssen. Mit anderen Worten, ich möchte JQuerys '$ .Event ('keydown', {welcher: aKeyCode})' Funktion auf CodeMirror verwenden. – zakdances

+0

Ich möchte nicht auf die Veranstaltung hören, ich möchte ** das Ereignis auslösen **. Sehen Sie sich [diese andere SO-Frage] (http://stackoverflow.com/questions/832059/definitive-way-to-trigger-keypress-events-with-jquery) und [die JQuery-Trigger-Dokumente] an (http: // api .jquery.com/trigger /) als Referenz. – zakdances

+0

Sie können der cm-Instanz nach der Initialisierung einen Ereignis-Listener wie folgt hinzufügen: Initiieren Sie: 'var cm = CodeMirror (Ziel, {Wert: Wert});' und dann hören: 'cm.on ('keydown', function (cm, e) {Alarm (e.keyCode);}); '. Entschuldigung, ich sehe Ihre Anfrage für einen ** Trigger ** jetzt. –

0

Ich habe den gleichen Schmerz auch, und schließlich finde ich die Lösung. Ich weiß nicht, ob das hässlich ist oder nicht, aber es funktioniert bei mir. Ich hoffe es funktioniert bei dir.

myCodeMirror.options.extraKeys.F11(); //trigger F11 assigned function 
myCodeMirror.options.extraKeys.["Ctrl-S"](); //trigger Ctrl-S assigned function 
0

Codemirror kommt mit einer undokumentierten Funktion triggerOnKeyDown, mit dem Sie eine Taste nach unten auf Codemirror auslösen können:

const ev = { 
    type: 'keydown', 
    keyCode: 40 // the keycode for the down arrow key, use any keycode here 
} 
cm.triggerOnKeyDown(ev) 
+0

Sie sollten Ihre Lösung beschreiben. – Jess