2010-12-27 10 views
16

Gibt es eine Möglichkeit, den Cursor auf das Ende des Inhalts eines CKEditors zu setzen? AuchWie setze ich die Cursorposition am Ende des Textes in CKEditor?

Dieser Entwickler gefragt, erhielt aber keine Antwort:

http://cksource.com/forums/viewtopic.php?f=11&t=19877&hilit=cursor+end

ich den Fokus am Ende des Textes innerhalb eines CKEditor festlegen möchte. Wenn ich folgendes benutze:

ckEditor.focus(); 

Es bringt mich zum Anfang des Textes schon in den CKEditor.

Antwort

-1

haben Sie versucht ckEditor.Selection.Collapse (false);

+3

Ich sehe nicht, worüber Sie reden genau sprechen. Was ist die genaue Syntax? Ich sehe kein Selection-Feld auf meinem ckeditor-Objekt. – BrooklynDev

+0

-1 Funktioniert nicht für mich entweder –

4

Nach einem bisschen Fummelei, habe ich es bekommen habe mit dem folgenden Code zu arbeiten:

$(document).ready(function() { 

    CKEDITOR.on('instanceReady', function(ev) { 

     ev.editor.focus(); 

     var s = ev.editor.getSelection(); // getting selection 
     var selected_ranges = s.getRanges(); // getting ranges 
     var node = selected_ranges[0].startContainer; // selecting the starting node 
     var parents = node.getParents(true); 

     node = parents[parents.length - 2].getFirst(); 

     while (true) { 
      var x = node.getNext(); 
      if (x == null) { 
       break; 
      } 
      node = x; 
     } 

     s.selectElement(node); 
     selected_ranges = s.getRanges(); 
     selected_ranges[0].collapse(false); // false collapses the range to the end of the selected node, true before the node. 
     s.selectRanges(selected_ranges); // putting the current selection there 
    } 

}); 

Die Idee ist:

  1. den Wurzelknoten Get (nicht Körper)
  2. Gehen Sie zum nächsten Knoten vor, bis keine Knoten mehr vorhanden sind.
  3. Wählen Sie den letzten Knoten aus.
  4. Collapse es
  5. Set Bereich
+0

FYI, das funktioniert nicht in IE8. '.getSelection()' wird nicht unterstützt ... – gabaum10

7

Gemäß der Dokumentation für CKEditor 4 können Sie folgendes tun, wenn Sie den Editor-Objekt haben.

var range = editor.createRange(); 
range.moveToPosition(range.root, CKEDITOR.POSITION_BEFORE_END); 
editor.getSelection().selectRanges([ range ]); 

-Link: http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection (unter selectRanges-Funktion).

+0

Was zum Teufel ist '[Bereiche]' ?? Ist das "s" ein Tippfehler? – mpen

+0

@Mark, danke für den Haken. Es sollte "Reichweite" sein. Das bekomme ich, wenn ich die CKEditor-Dokumentation nicht überprüfe. – Dan

+0

Ich war nicht ganz sicher, weil die Square-Bracket-Syntax es fast wie einen Platzhalter für etwas anderes aussehen lässt. – mpen

16

Dan Antwort bekam seltsame Ergebnisse für mich, aber geringfügige Änderung (zusätzlich fix Typo) machte es funktioniert:

var range = me.editor.createRange(); 
range.moveToElementEditEnd(range.root); 
me.editor.getSelection().selectRanges([ range ]); 
+1

Danke, gleich hier. Dans Lösung hat das Caret für mich eingefügt, aber am rechten Rand des Editors entsprechend dem erwarteten Endpunkt. Dein hat es repariert, danke. – halfer

+0

Yap, Dan Lösung war den Cursor auf eine neue Zeile werfen ... – Roberto

+0

Danke funktioniert .. jetzt um herauszufinden, wie man den Editor programmatisch eingeben (Fokus bringt keine Caret auf) –

1

CKEditor 3.x:

on : { 
     'instanceReady': function(ev) { 
      ev.editor.focus(); 
      var range = new CKEDITOR.dom.range(ev.editor.document); 
      range.collapse(false); 
      range.selectNodeContents(ev.editor.document.getBody()); 
      range.collapse(false); 
      ev.editor.getSelection().selectRanges([ range ]); 
     } 
    } 

basierend auf Pseudo-Code von den Entwicklern hier zur Verfügung gestellt:

https://dev.ckeditor.com/ticket/9546#comment:3

Sie müssen den Editor fokussieren, das Dokumentobjekt holen, in den Bereich collapse range (mit false parameter) setzen, Körper auswählen (mit selectNodeContents), ihn zusammenklappen (mit false parameter) und schließlich auswählen. Am besten ist es, alles im Fall instanceReady zu machen.

1

Hier ist eine ähnliche Antwort auf @ Peter-Tracey. In meinem Fall fügt mein Plugin ein Zitat ein. Wenn der Benutzer eine Auswahl getroffen hat, musste ich die Auswahl deaktivieren und den Cursor am Ende des Satzes platzieren.

// Obtain the current selection & range 
    var selection = editor.getSelection(); 
    var ranges = selection.getRanges(); 
    var range = ranges[0]; 

    // Create a new range from the editor object 
    var newRange = editor.createRange(); 

    // assign the newRange to move to the end of the current selection 
    // using the range.endContainer element. 
    var moveToEnd = true; 
    newRange.moveToElementEditablePosition(range.endContainer, moveToEnd); 

    // change selection 
    var newRanges = [newRange]; 
    selection.selectRanges(newRanges); 

    // now I can insert html without erasing the previously selected text. 
    editor.insertHtml("<span>Hello World!</span>"); 
0

Dies ist die einfachste Lösung, die von der ckeditor API bereitgestellt wird.Ich habe es auf IE10 +, ff, Safari und Chrome getestet:

range = editor.createRange(); 
// the first parameter is the last line text element of the ckeditor instance 
range.moveToPosition(new CKEDITOR.dom.node(editor.element.$.children[pos - 1]), CKEDITOR.POSITION_BEFORE_END) 
range.collapse() 
editor.getSelection().selectRanges([ range ]) 
Verwandte Themen