Ich bin auf der Suche nach einer endgültigen, browserübergreifenden Lösung, um die Cursor- / Caret-Position auf die letzte bekannte Position zu setzen, wenn ein contentEditable = 'on' <div> den Fokus wiedererlangt. Es scheint, dass die Standardfunktionalität eines inhaltsbearbeitbaren Divs darin besteht, das Caret / den Cursor jedes Mal, wenn Sie darauf klicken, an den Anfang des Textes im Div zu bewegen, was unerwünscht ist.
Ich glaube, ich müsste die aktuelle Cursorposition in einer Variablen speichern, wenn sie den Fokus des Div verlassen, und diese dann zurücksetzen, wenn sie den Fokus wieder im Inneren haben, aber ich konnte sie nicht zusammenstellen oder eine Arbeit finden Codebeispiel noch.
Wenn jemand irgendwelche Gedanken, Arbeitscode-Schnipsel oder Beispiele hat, würde ich mich freuen, sie zu sehen.
Ich habe noch keinen Code, aber hier ist was ich 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 diese Ressource ausprobiert, aber es scheint, dass sie für ein <div> nicht funktioniert. Möglicherweise nur für den Textbereich ( So bewegen Sie den Cursor zum Ende einer inhaltsbearbeitbaren Entität )
contentEditable
in Nicht-IE-Browsern funktioniert. O_oAntworten:
Dies ist mit den standardbasierten Browsern kompatibel, wird jedoch im IE wahrscheinlich fehlschlagen. Ich biete es als Ausgangspunkt. IE unterstützt DOM Range nicht.
quelle
cursorStart.appendChild(document.createTextNode('\u0002'));
ist ein vernünftiger Ersatz, denken wir. für die - char. Vielen Dank für den CodeDiese Lösung funktioniert in allen gängigen Browsern:
saveSelection()
wird an dieonmouseup
undonkeyup
-Ereignisse des div angehängt und speichert die Auswahl in der VariablensavedRange
.restoreSelection()
wird an dasonfocus
Ereignis des div angehängt und wählt die in gespeicherte Auswahl erneut aussavedRange
.Dies funktioniert einwandfrei, es sei denn, Sie möchten, dass die Auswahl wiederhergestellt wird, wenn der Benutzer auch auf das Div klickt (was etwas unintuitiv ist, da Sie normalerweise erwarten, dass der Cursor dorthin geht, wo Sie klicken, der Vollständigkeit halber jedoch Code enthalten).
Um dies zu erreichen, werden die
onclick
undonmousedown
Ereignisse von der Funktion abgebrochen,cancelEvent()
die eine browserübergreifende Funktion zum Abbrechen des Ereignisses ist. DiecancelEvent()
Funktion führt dierestoreSelection()
Funktion auch aus, da das Div beim Abbrechen des Klickereignisses keinen Fokus erhält und daher überhaupt nichts ausgewählt wird, es sei denn, diese Funktionen werden ausgeführt.Die Variable
isInFocus
speichert, ob sie fokussiert ist und wird in "false"onblur
und "true" geändertonfocus
. Auf diese Weise können Klickereignisse nur abgebrochen werden, wenn das Div nicht im Fokus steht (andernfalls können Sie die Auswahl überhaupt nicht ändern).Wenn Sie möchten, dass die Auswahl geändert wird, wenn das Div durch einen Klick fokussiert wird, und die Auswahl nicht wiederhergestellt wird
onclick
(und nur, wenn das Element programmgesteuert mitdocument.getElementById("area").focus();
oder ähnlich fokussiert wird, entfernen Sie einfach die Ereignisseonclick
undonmousedown
. Dasonblur
Ereignis und die FunktionenonDivBlur()
undcancelEvent()
kann unter diesen Umständen auch sicher entfernt werden.Dieser Code sollte funktionieren, wenn er direkt in den Text einer HTML-Seite eingefügt wird, wenn Sie ihn schnell testen möchten:
quelle
if (window.getSelection)...
nur getestet, ob der Browser unterstütztgetSelection
, nicht ob eine Auswahl vorhanden ist oder nicht?getSelection
API oder die Legacy-document.selection
API verwendet werden soll, die von älteren IE-Versionen verwendet wird. Der späteregetRangeAt (0)
Aufruf wird zurückgegeben,null
wenn keine Auswahl vorhanden ist, die in der Wiederherstellungsfunktion überprüft wird.else if (document.createRange)
) ist das, was ich sehe. Es wird nur aufgerufen, wennwindow.getSelection
es nicht existiert, aber verwendetwindow.getSelection
window.getSelection
aber nichtdocument.createRange
- was bedeutet, dass der zweite Block niemals verwendet werden würde ...Aktualisieren
Ich habe eine browserübergreifende Bereichs- und Auswahlbibliothek namens Rangy geschrieben , die eine verbesserte Version des unten veröffentlichten Codes enthält. Sie können das Modul zum Speichern und Wiederherstellen der Auswahl für diese spezielle Frage verwenden, obwohl ich versucht wäre, die Antwort von @Nico Burns zu verwenden, wenn Sie mit der Auswahl in Ihrem Projekt nichts anderes tun und nicht den Großteil von a benötigen Bibliothek.
Vorherige Antwort
Sie können IERange ( http://code.google.com/p/ierange/ ) verwenden, um den TextRange des IE in einen DOM-Bereich zu konvertieren und ihn in Verbindung mit dem Ausgangspunkt der Augenlidlosigkeit zu verwenden. Persönlich würde ich nur die Algorithmen von IERange verwenden, die die Range <-> TextRange-Konvertierungen durchführen, anstatt das Ganze zu verwenden. Das Auswahlobjekt des IE verfügt nicht über die Eigenschaften focusNode und anchorNode, sondern Sie sollten stattdessen nur den aus der Auswahl erhaltenen Bereich / Textbereich verwenden können.Ich könnte etwas zusammenstellen, um dies zu tun, werde hier zurück posten, wenn und wann ich es tue.
BEARBEITEN:
Ich habe eine Demo eines Skripts erstellt, das dies tut. Es funktioniert in allem, in dem ich es bisher ausprobiert habe, mit Ausnahme eines Fehlers in Opera 9, für den ich noch keine Zeit hatte. Browser, in denen es funktioniert, sind IE 5.5, 6 und 7, Chrome 2, Firefox 2, 3 und 3.5 und Safari 4 unter Windows.
http://www.timdown.co.uk/code/selections/
Beachten Sie, dass die Auswahl in Browsern rückwärts getroffen werden kann, sodass sich der Fokusknoten am Anfang der Auswahl befindet. Wenn Sie die rechte oder linke Cursortaste drücken, wird das Caret an eine Position relativ zum Beginn der Auswahl verschoben. Ich denke nicht, dass es möglich ist, dies beim Wiederherstellen einer Auswahl zu replizieren, daher befindet sich der Fokusknoten immer am Ende der Auswahl.
Ich werde dies bald vollständig aufschreiben.quelle
Ich hatte eine verwandte Situation, in der ich speziell die Cursorposition auf das ENDE eines inhaltsbearbeitbaren Div setzen musste. Ich wollte keine vollwertige Bibliothek wie Rangy verwenden, und viele Lösungen waren viel zu schwer.
Am Ende habe ich mir diese einfache jQuery-Funktion ausgedacht, um die Karatposition auf das Ende eines inhaltsbearbeitbaren Divs zu setzen:
Die Theorie ist einfach: Hängen Sie eine Spanne an das Ende der Bearbeitbarkeit an, wählen Sie sie aus und entfernen Sie die Spanne. Am Ende der Div befindet sich ein Cursor. Sie können diese Lösung anpassen, um die Spanne an einer beliebigen Stelle einzufügen und so den Cursor an einer bestimmten Stelle zu platzieren.
Die Verwendung ist einfach:
Das ist es!
quelle
<span>
, da dies den integrierten Rückgängig-Stapel des Browsers unterbricht. Siehe stackoverflow.com/a/4238971/96100Ich nahm die Antwort von Nico Burns und machte sie mit jQuery:
div contentEditable="true"
Sie benötigen jQuery 1.6 oder höher:
Code-Snippet anzeigen
quelle
Nachdem ich herumgespielt habe, habe ich die Antwort von Eyelidlessness oben geändert und daraus ein jQuery-Plugin gemacht, sodass Sie einfach eine der folgenden Aktionen ausführen können:
Entschuldigen Sie den langen Code-Beitrag, aber er kann jemandem helfen:
quelle
Sie können selectNodeContents nutzen, das von modernen Browsern unterstützt wird.
quelle
In Firefox befindet sich möglicherweise der Text des div in einem untergeordneten Knoten (
o_div.childNodes[0]
)quelle