Set cursor position auf contentEditable <div>
Ich bin, nach einer endgültigen, cross-browser-Lösung, um den cursor/Einfügemarke position, um die Letzte bekannte position, wenn eine contentEditable='on' <div> wieder aktiv ist. Es erscheint die Standard-Funktionalität eines content-editable div verschieben der Einfügemarke/cursor an den Anfang des Textes im div-jedes mal, wenn Sie klicken Sie auf es, was unerwünscht ist.
Ich glaube, ich würde zum speichern in einer Variablen an der aktuellen cursor-position, wenn Sie verlassen Schwerpunkt der div, und dann neu eingestellt, wenn Sie den Fokus wieder nach drinnen, aber ich habe nicht in der Lage zusammen zu stellen, oder finden Sie ein funktionierendes code-Beispiel noch.
Wenn jemand hat irgendwelche Gedanken, arbeiten, code-snippets oder samples, ich würde glücklich sein, Sie zu sehen.
Ich glaube nicht wirklich, dass jeder code, aber hier ist was ich zu tun habe:
<script type="text/javascript">
//jQuery
$(document).ready(function() {
$('#area').focus(function() { .. } //focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>
PS. Ich habe versucht, diese Ressource aber es scheint, es funktioniert nicht für eine <div>. Vielleicht nur für textarea (Wie bewegen Sie den cursor zu Ende contenteditable Person)
InformationsquelleAutor der Frage GONeale | 2009-07-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist kompatibel mit den standards-basierten Browsern, wird aber wahrscheinlich nicht im IE. Ich bin die Bereitstellung von it als Ausgangspunkt. IE unterstützt keine DOM-Bereich.
InformationsquelleAutor der Antwort eyelidlessness
Diese Lösung funktioniert in allen wichtigen Browsern:
saveSelection()
verbunden ist, um denonmouseup
undonkeyup
Veranstaltungen der div-Element und speichert die Auswahl der VariablensavedRange
.restoreSelection()
verbunden ist, um denonfocus
- event des div-und reselects die Auswahl gespeichert insavedRange
.Diese funktioniert perfekt, es sei denn, Sie wollen die Auswahl wiederhergestellt werden, wenn der Benutzer klickt auf den div aswell (das ist ein bisschen unintuitative als Sie normalerweise erwarten, dass Sie den cursor zu gehen, wo Sie klicken Sie auf code aber der Vollständigkeit halber enthalten)
Zu erreichen, hat die
onclick
undonmousedown
Veranstaltungen sind abgesagt, die von der FunktioncancelEvent()
die eine cross-browser-Funktion, die Veranstaltung abzusagen. DiecancelEvent()
Funktion läuft auchrestoreSelection()
Funktion, weil das click-Ereignis abgebrochen wird das div-Element nicht den Fokus erhalten und wird deshalb nicht ausgewählt, es sei denn, diese Funktionen ausführen.Die variable
isInFocus
speichert, ob es im Fokus ist und geändert wird "false"onblur
und "true"onfocus
. Dies ermöglicht auf Ereignisse klicken, werden nur gelöscht, wenn das div-Element nicht den Fokus hat (sonst wären Sie nicht in der Lage sein, um die Auswahl zu ändern).Wenn Sie möchten, um die Auswahl zu ändern, wenn das div-Element konzentriert durch ein klicken, und Sie nicht wiederherstellen Sie die Auswahl
onclick
(und nur wenn der Fokus wird auf das element programtically mitdocument.getElementById("area").focus();
oder ähnliches, dann entfernen Sie einfach dieonclick
undonmousedown
Veranstaltungen. Dieonblur
Ereignis und dieonDivBlur()
undcancelEvent()
Funktionen kann auch sicher entfernt werden, in diesen Umständen.Dieser code sollte funktionieren, wenn Sie fallen direkt in den body einer html-Seite, wenn Sie möchten, um es zu testen schnell:
InformationsquelleAutor der Antwort Nico Burns
Update
Ich geschrieben habe, eine cross-browser-Auswahl und-Auswahl-Bibliothek namens Feingliedrig , beinhaltet eine verbesserte version der code, den ich unten geschrieben. Sie können die Auswahl speichern und wiederherstellen-Modul für diese Frage, obwohl, ich würde geneigt sein, etwas zu verwenden, wie @Nico Brennt ' s Antwort wenn Sie nicht tun, alles andere, was die Auswahl der in Ihrem Projekt und brauchen nicht den Hauptteil der Bibliothek.
Vorherigen Antwort
können Sie IERange (http://code.google.com/p/ierange/) zu konvertieren IE TextRange in so etwas wie eine DOM-Bereich und verwenden Sie es in Verbindung mit etwas wie eyelidlessness Ausgangspunkt. Ich persönlich würde nur die algorithmen verwenden von IERange, die den Bereich <-> TextRange-Konvertierungen, anstatt die ganze Sache. Und IE ' s selection-Objekt hat nicht die focusNode und anchorNode Eigenschaften, aber Sie sollten in der Lage sein, um Sie nur den Bereich/TextRange-gewonnen aus der Selektion statt.Könnte ich etwas zusammen, um dies zu tun, wird der post wieder hier, wenn und wenn ich.
EDIT:
Ich habe eine demo von einem Skript, das dies tut. Es funktioniert alles was ich probiert habe, in so weit außer einem bug in Opera 9, welchen ich noch nicht Zeit gehabt sich noch. Browsern es funktioniert in IE 5.5, 6 und 7, Chrome 2, Firefox 2, 3 und 3.5 und Safari 4, die alle auf Windows.
http://www.timdown.co.uk/code/selections/
Beachten Sie, dass die Auswahl gemacht werden kann rückwärts im Browser, so dass der Fokus Knoten an den Anfang der Auswahl, und drücken Sie die Rechte oder linke cursor-Taste bewegt das caret um eine position relativ zum Anfang der Auswahl. Ich glaube nicht, dass es möglich ist, zu replizieren diese beim wiederherstellen der Auswahl, so dass der Fokus Knoten immer am Ende der Auswahl.
ich Schreibe dies vollständig irgendwann bald.InformationsquelleAutor der Antwort Tim Down
Hatte ich eine Verwandte situation, wo ich konkret brauchte, um die cursor-position bis zum ENDE des contenteditable div. Ich habe nicht verwenden möchten, eine vollwertige Bibliothek, wie Feingliedrig und viele Lösungen wurden viel zu Schwergewicht.
In das Ende, ich kam mit dieser einfachen jQuery-Funktion zum festlegen der carat-position bis zum Ende des contenteditable div:
Die Theorie ist einfach: fügen Sie einen span am Ende des editierbar, markieren Sie es, und entfernen Sie dann die span - verlassen uns mit einem cursor an das Ende der div. Sie könnten eine Anpassung dieser Lösung legen Sie die Zeitspanne, wo immer Sie wollen, damit setzen Sie den cursor an eine bestimmte Stelle.
Nutzung ist einfach:
Das ist es!
InformationsquelleAutor der Antwort Zane Claes
Nach spielen um, die ich geändert habe eyelidlessness' Antwort oben und machte es zu einem jQuery-plugin, so können Sie nur tun, eine dieser:
Entschuldigen Sie den langen code-post, aber vielleicht hilft es jemand:
InformationsquelleAutor der Antwort mkaj
Können Sie nutzen selectNodeContentsdie mit modernen Browsern möglich.
InformationsquelleAutor der Antwort zoonman
In Firefox müssen Sie möglicherweise den text der div in einem untergeordneten Knoten (
o_div.childNodes[0]
)InformationsquelleAutor der Antwort yoav