Set cursor an bestimmte position in CKEditor
Gibt es eine Möglichkeit zum festlegen der cursor-position auf einen bekannten index innerhalb CKEditor?
Ich möchte dies tun, weil wenn ich die html im editor, er setzt den cursor an den Beginn des eingefügten Elements, das ist ein problem, so wie ich bin ändern der Inhalte on-the-fly während der Benutzer tippt.
Wenn ich weiß, dass ich möchte, um den cursor wieder auf einen bekannten Charakter position, sagen wir 100, im editor ist das möglich?
(Ich fragte eine stellt sich die Frage, aber ich glaube, ich war overcomplicating das Problem mit Beispiel-code.)
InformationsquelleAutor der Frage manannan | 2013-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die grundlegende Art und Weise der Einstellung ist durch erstellen eine Bereichdie Einstellung seiner position und auswählen.
Hinweis: wenn Sie nicht wissen, den Bereich API (oder zumindest die Idee, die dahinter steht reicht), werden Sie nicht in der Lage zur Auswahl. Hier ist eine ziemlich gute Einführung - DOM-Range-spec (ja, es ist eine Spezifikation, aber es ist gut). CKEditor Bereich API ist sehr ähnlich, aber etwas größer.
Beispiel:
Oder anderen Fall:
Wiederherstellen Auswahl nach der änderung DOM
Aber sehr oft wollen Sie nicht wählen Sie eine neue Palette, aber für die Wiederherstellung einer alten Auswahl oder Bereich. Erste Sache, die Sie wissen müssen ist, dass es unmöglich korrekt wiederherstellen Auswahl, wenn Sie einen unkontrollierten DOM-änderungen. Sie müssen in der Lage sein zu verfolgen, der Container und die offsets der Auswahl des start-und end.
Bereich hält die Verweise auf die start-und end-Container (in
startContainer
undendContainer
Eigenschaften). Leider werden diese Verweise können verletzt werden durch:innerHTML
,Das gleiche kann passieren, mit offsets (
startOffset
undendOffset
Eigenschaften) - wenn Sie entfernt eine der start/Ziel-container untergeordneten Knoten diese offsets müssen möglicherweise aktualisiert werden.So, in manchen Situationen reichen Instanz ist nicht hilfreich, wenn wir uns erinnern wollen, eine Auswahl position. Ich werde erläutern Sie drei grundlegende Möglichkeiten, um mit diesem problem umzugehen.
Erste, das ist unser plan:
Hinweis: Von nun an benutze ich "reicht" im plural, weil Firefox unterstützt mehrere bereichsauswahlen - eine Auswahl enthalten kann, die mehr als einen Bereich (versuchen Sie z.B., verwenden Sie STRG-Taste gedrückt, während Sie Auswahlen).
Lösung 1 - durch eine Reihe
Dies ist die einfachste Lösung. Es wird nur funktionieren, wenn das DOM-änderungen, die wir gemacht haben nicht veraltet reicht, oder wir wissen, wie Sie zu aktualisieren.
Lösung-2 - durch eine aufdringliche Lesezeichen
Lesezeichen erstellt durch die
createBookmarks
Methode insert unsichtbar<span>
Elemente mit speziellen Eigenschaften (einschließlichdata-cke-bookmark
) bei der Auswahl der Bereiche start-und end-Punkte.Wenn Sie können, vermeiden Sie die unkontrollierte
innerHTML
verpasst und stattdessen hinzufügen/entfernen/verschieben einiger Knoten, dann denken Sie einfach daran, dass Sie um den Erhalt dieser<span>
Elemente und diese Methode funktioniert perfekt. Sie können auch Lesezeichen verschieben' von Elementen, wenn Sie Ihre änderungen sollten ändern Sie die Auswahl als gut.Standardmäßig Lesezeichen halten Sie Verweise auf Ihre
<span>
Elemente, aber Sie können auch serializable-Lesezeichen vorbeitrue
zu dencreateBookmarks
Methode. Diese Art von Lesezeichen halten Referenzen auf Knoten-ids, so können Sie überschreiben gesamteinnerHTML
.Hinweis: Diese Methode ist auch in einer Bereich API.
Dies ist die beliebteste Methode, denn Sie haben die volle Kontrolle über die Auswahl und Sie können ändern, DOM, obwohl Sie brauchen zu kümmern, Lesezeichen'
spans
.Lösung 3 - von einem nicht aufdringlich Lesezeichen
Hinweis: In dieser Lösung verwenden wir
createBookmarks
2
Methode.Hier erstellen wir Ihnen auch ein array mit Lesezeichen Objekte, aber wir stecken Sie nicht alle Elemente in DOM. Diese Lesezeichen speichern Sie Ihre Positionen durch die Adressen. Adresse ist ein array von Vorfahren Indizes in Ihre Eltern.
Diese Lösung ist sehr ähnlich wie Lösung 1, aber Sie können überschreiben gesamte
innerHTML
weil es (höchstwahrscheinlich ;>) wird sich nicht ändern die Adressen von Lesezeichen' Knoten. Obwohl, in solch einem Fall sollten Sie passtrue
zucreateBookmarks2
um die normalisierten Adressen, da benachbarte Textknoten zusammengeführt werden und leere entfernt, wenn die EinstellunginnerHTML
.Zusammenfassend...
... In Zusammenarbeit mit DOM und die Auswahl ist nicht trivial. Sie müssen wissen, was Sie tun, müssen Sie wissen, DOM, und Sie müssen, um die richtige Lösung für Ihr problem. Am häufigsten wird es die zweite, aber es hängt vom Fall.
InformationsquelleAutor der Antwort Reinmar
Die Antwort von Reinmar führte mich zu dieser Lösung
HINWEIS: die moveToBookmark Funktion ist nicht dokumentiert in der api, aber es war sehr hilfreich und war die einzige Lösung, die für mich gearbeitet. Ich bin sicherlich kein Experte auf ckeditor und nahm mir ein paar Tage, um eine funktionierende Lösung. So moveToBookmark vielleicht eine veraltete Funktion bin ich mir nicht sicher.
InformationsquelleAutor der Antwort codeAline