2010-09-24 13 views
10

Ich habe eine einfache contenteditable div mit etwas Text drin. On onkeyup Ereignis Ich möchte den gesamten Inhalt (innerHTML) des div basierend auf Regex ersetzen.Ändern Sie die Cursorposition im contenteditable div nach dem Ändern von innerHTML

Zum Beispiel

HTML:

some text, more text and $even more text 

Funktion, in der ich plane, den gesamten Text mit $ ($ sogar in Beispiel oben) und es in Span-Tag wickeln zu erhalten:

div.onkeypress = function() { 
    div.innerHTML.replace(/(some_regexp)/, "<span class='class'>$1</span>"); 
}; 

Das Problem ist nach solchen Ersatz-Cursor springt an den Anfang des div. Ich möchte, dass es dort bleibt, wo es vorher war.

Ich stelle mir vor, ich muss die Koordinaten des Cursors vor der Änderung speichern und dann irgendwie setzen sie den Cursor zurück, aber wie kann ich es tun? :)

Ich habe versucht, Bereich Objekt speichern, aber nach der Bearbeitung glaube ich, dass es nirgends hinweist.

Danke!

+0

Was den Ersatz HTML nicht aussehen? –

+0

Ich habe die ursprüngliche Frage aktualisiert. Wenn Sie wissen, wie Sie erwartetes Verhalten auf andere Weise erreichen können, ohne das ganze innereHTML zu ändern - wäre es toll zu hören. –

+0

Ich weiß, es ist eine alte Frage, aber hast du eine Lösung dafür gefunden? Ich habe genau das gleiche Bedürfnis –

Antwort

2

Das Problem ist, dass Sie die gesamte innerHTML aktualisieren, aber nur ein kleiner Teil davon ändert sich. Sie können keinen regulären Ausdruck und keinen Massenersatz verwenden. Sie müssen das div scannen und nach Übereinstimmungen suchen, daraus Textbereiche erstellen und den Inhalt mit der span umbrechen. Siehe http://www.quirksmode.org/dom/range_intro.html, Programmgesteuertes Erstellen eines Bereichs.

Allerdings denke ich, das wird nicht funktionieren, wenn der Cursor im Text ist, der ersetzt werden soll, es ist aber ein Anfang.

+0

Ich versuchte Ihren Vorschlag, aber obwohl ich Reichweite verwendete, kehrt die Caret-Position zurück zum Anfang des div. – carmina

+0

@carmina Schwer zu sagen, wenn Sie Ihren Code nicht zeigen. Wenn Sie jedoch eine Frage haben, stellen Sie sie bitte als neue Frage (mit dem von Ihnen verwendeten Code), damit sie richtig adressiert werden kann. –

+0

siehe: http://stackoverflow.com/questions/20262798/using-insertnode-to -add-a-span-in-einem-contenteditable-div-changes-the-cursor-posit – carmina

1

Sie wissen, welchen Text Sie ersetzen. Sie kennen also die Position dieses Textes. Dort wirst du nur den neuen Text schreiben. Dann ist auch die Position gleich. Nach dem Schreiben von neuem HTML, können Sie den Cursor setzen.

für zB

I undertsand nicht die Frage

Position Frage ist 5 ein i ersetzen

ich undertsand nicht die Antwort

die Cursorposition

bis 5 machen

http://ajaxian.com/archives/javascript-tip-cross-browser-cursor-positioning

http://hartshorne.ca/2006/01/23/javascript_cursor_position/

http://geekswithblogs.net/svanvliet/archive/2005/03/24/textarea-cursor-position-with-javascript.aspx

1

Ich nahm diese aus einem anderen Forum. Es hat mein Problem gelöst.

Ok, ich es geschafft, um es an die Arbeit, hier ist die Lösung, wenn jemand interessiert:

Speichern Sie die Auswahl x, y:

Code:

cursorPos=document.selection.createRange().duplicate(); 
clickx = cursorPos.getBoundingClientRect().left; 
clicky = cursorPos.getBoundingClientRect().top; 

die Auswahl Restore:

Code:

cursorPos = document.body.createTextRange(); 
cursorPos.moveToPoint(clickx, clicky); 
cursorPos.select(); 

Sie können es sehen, hier zu arbeiten:

http://www.tachyon-labs.com/sharpspell/

+0

Fehle ich etwas? Folgte dem Link, ausgewählte Live-Demo. Klicken Sie in die Mitte des Wortes, klicken Sie mit der rechten Maustaste, die ausgewählte Option und der Cursor sprang bis zum Ende der Zeile. –

Verwandte Themen