Wir haben TinyMCE von 3.x auf 4.2.5 aktualisiert und können die Standardaktion ENTER nicht verhindern.

Unser Ziel ist es, das Formular zu senden, wenn CTRL + enter gedrückt wird. Wichtig ist, dass das Senden erfolgt, bevor die neue Zeile zu TinyMCE hinzugefügt wird. Mit dem Zweig 3.x konnten wir das Ereignis oben in der Warteschlange hinzufügen:

// Important: inject new eventHandler via addToTop to prevent other events
tinymce.get('tinymce_instance').onKeyDown.addToTop(function(editor, event) {
    if (event.ctrlKey && event.keyCode == 13) {
        $("form").submit();
        return false;
    }
});

Leider können wir nicht herausfinden, wie wir es wieder an die Spitze der Ereignisse setzen können.

event.preventDefault() und event.stopPropagation() haben nicht den erwarteten Effekt, da die Eingabe bereits vorhanden ist. Das Seltsame ist, dass es bei anderen Schlüsseln funktioniert, die alphanumerischen Schlüssel können verhindert werden. http://jsfiddle.net/zgdcg0cj/

Das Ereignis kann mithilfe des folgenden Snippets hinzugefügt werden:

tinymce.get('tinymce_instance').on('keydown', function(event) {
    if (event.ctrlKey && event.keyCode == 13) {
        $("form").submit();
        return false;
    }
});

Problem: Die neue Zeile wird dem TinyMCE-Inhalt früher hinzugefügt, als unser Ereignishandler aufgerufen wird, sodass eine unerwünschte Eingabe gespeichert wird. Wie kann ich das Ereignis oben im Zweig 4.x hinzufügen oder verhindern, dass die neue Zeile auftritt?

5
Rvanlaak 2 Sept. 2015 im 14:42

3 Antworten

Beste Antwort

event.preventDefault() funktioniert, wenn Sie das Keydown-Ereignis über setup in der Funktion init anhängen.

tinymce.init({
  selector:'textarea',
  setup: function (ed) {
    ed.on('keydown',function(e) {
        if(e.ctrlKey && e.keyCode == 13){
            alert("CTRL + ENTER PRESSED");
            e.preventDefault();
        }
    });
  }
});

Dies blockiert den Wagenrücklauf. JsFiddle

Bearbeiten:

Oben ist eine Möglichkeit, dies zu tun. Ich habe eine andere Möglichkeit gefunden, um das Ergebnis zu erzielen, für das init überhaupt nicht erforderlich ist. Stattdessen erstellen wir eine neue Editor-Instanz und binden sie an unser Textfeld, sofern es ein id enthält.

HTML

<form>
    <!--Select by ID this time -->
    <textarea id='editor_instance_1'>A different way</textarea>
</form>

JS

var ed = new tinymce.Editor('editor_instance_1', {
    settings: "blah blah"
}, tinymce.EditorManager);

//attach keydown event to the editor
ed.on('keydown', function(e){
    if(e.ctrlKey && e.keyCode == 13){
        alert("CTRL + ENTER");
        e.preventDefault();
    }
});

//render the editor on screen
ed.render();
4
PalinDrome555 2 Sept. 2015 im 18:17

Vielleicht bin ich zu spät, aber diese Antwort ist für diejenigen, die das Init-Setup für Tinymce nicht ändern können (oder wollen). Ich habe folgende Methode gefunden:

var frame = document.getElementById('id_of_editor_iframe');
var iframeDocument = fr.contentWindow.document;
iframeDocument.addEventListener('keydown', function(e) {
    if (
        [38, 40, 13].indexOf(e.keyCode) > -1 //Enter and up/down arrows or whatever you want
    ) {

        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();

        // your code here
        return false;
    }
}, true);

Es hat mir geholfen, neue Zeilen im Editor zu verhindern

1
Vyacheslav Tsivina 11 Juli 2017 im 08:48
var init {
    ...,
    setup: function (ed) {
        ed.on('keydown', function (e) {
            if (e.ctrlKey && 13 === e.keyCode) {
                e.preventDefault();
                $("form").submit();
            }
        });
};

tinymce.init(init);

Funktioniert für tinyMCE 4.x.

1
Leo Zhu 29 Sept. 2015 im 18:46