JavaScript 'contenteditable' — Erste/ - Einstellung Cursor-Position
Ich habe gelesen, ein paar Beiträge über die Positionierung der Einfügemarke, aber keiner scheint die Beantwortung meiner speziellen Frage.
- Ich habe 2 divs (div1 und div2)
- div1 = fest vorgegebenen div -
- div2 = contenteditable div
- beide divs enthalten exakt die gleichen Inhalte
- wenn der Benutzer klickt auf div1, wird es ausgeblendet, und div2 erscheint in der genauen Lage und der Benutzer Bearbeiten kann
Das problem: ich will das caret-Zeichen angezeigt, in dem genauen Standort auf div2 als div1
So, ich brauche eine Möglichkeit, LESEN Sie die Stelle, wo der Benutzer klickt auf div1, und dann, wenn div2 erscheint, platzieren Sie den cursor/Einfügemarke in derselben Lage, so eine getCaretLocation(in_div_id) und setCaretLocation(in_div_id) Satz von Funktionen.
Irgendeiner Weise zu tun?
Dank -
- Hi, hast du eine Lösung gefunden? Ich stehe vor dem gleichen problem, das macht mich wahnsinnig..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort : Sie können nicht
Lange Antwort : Das problem, das Sie konfrontiert werden, dass Sie werde in der Lage sein, um (x,y) - Koordinaten für das click-Ereignis div1, aber eine Umsetzung der position der Einfügemarke, während erfordern Sie die Kenntnis der position der Einfügemarke in den Inhalt (das ist die Anzahl der Zeichen vor dem Cursor).
Konvertieren (x,y) - Koordinaten, um eine Zeichenposition, die Sie wirklich brauchen, zu wissen, wie viele Zeichen wurden vor (dh. Links auf der aktuellen Zeile und oben, wenn der text ltr).
Wenn Sie eine Feste Breite-schriftart, können Sie vereinfachen das problem : die Zuordnung eines (x,y) - Koordinate zu einem (Zeile, Spalte) - Koordinate auf eine Zeichentabelle.
Jedoch, Sie noch vor dem problem, nicht zu wissen, wie der text umgebrochen wird. Zum Beispiel :
Klickt der Benutzer auf die d in dolor, wissen Sie, dass sich der Charakter der 1. auf die 2. Zeile, aber ohne Kenntnis der wrapping-Algorithmus gibt es keine Weise werden Sie wissen, dass es die 13 Zeichen in "Lorem ipsum dolor sit...". Und es gibt keine Garantie, dass so ein wrapping-Algorithmus ist identisch in allen Browsern und Plattform.
Nun, was ich Frage ist, warum würdest du mit 2 verschiedenen synchronisiert
div
in den ersten Platz ? Wäre es nicht einfacher mit nur einem div und setzen Sie dessen Inhalte bearbeitet werden, wenn der Benutzer klickt (oder schwebt) ?Könnten Sie legen Sie eine kleine span-element an den Cursor, um seine position, und entfernen Sie es. Für eine cross-browser-Palette und Auswahl der Bibliothek, siehe feingliedrig.
können Sie, im Grunde müssen Sie die temporären Inhalte editierbar auf Ihre erste div zu fangen Cursor pos
nun müssen nur get - /set-Cursor-Methode 🙂
edit > hier ist meine eigene, (live-demo)
Es klingt wie Sie versuchen zu tun, ein inline-Bearbeiten... haben Sie schaute auf die jeditable plugin?
Wenn Sie auf ein element, ein Selection-Objekt mit Länge null erstellt (bekommen Sie von element.getSelection() , where-element das div in Frage). Die focusOffset des Objekts wird Sie wissen lassen, dass Sie angeklickt haben, zum Beispiel die 74-Zeichen in das div (das ist die Sache, dass Adrien sagte, war unmöglich in einer anderen Antwort).
Lesen Sie die position der Einfügemarke in den text, und legen Sie dann Cursor-position im edit-Fenster.