Warum Ist Mein Contenteditable Cursor Springt an das Ende in Chrome?
Szenario
Ich habe eine contenteditable <div>
Bereich, und in diesem Bereich habe ich vielleicht einige <span contenteditable="false"></span>
mit etwas text. Die Idee ist, diese span-Elemente dar, formatierten text kann nicht bearbeitet, aber gelöscht werden können, die von der <div contenteditable="true"></div>
Bereich durch drücken der "backspace" - Taste.
Problem
Den cursor-Platzierung ist das große Thema hier. wenn Sie löschen eine dieser <span>
Elemente, springt der cursor an das Ende der <div>
. Mehr interessante, wenn Sie geben Sie text ein, während der cursor ist "am Ende" die Platzierung des Textes ist in Ordnung... Dann, wenn Sie löschen Sie den neu eingegebenen text, der cursor springt zurück!
Vorbereitet habe ich ein Turnschuh, dass dieses. Ich brauche, dies funktioniert nur in Chrome, und andere Browser sind entweder nicht-Sorge für jetzt oder Problemumgehungen vorhanden. (Beachten Sie auch die vorbereitete Geige gefertigt ist, um dies zu demonstrieren, in Chrom nur).
Fiddle Unterricht: Chrome Version 39.0.2171.95 m (64-bit) reproduziert in 32-bit-als auch
- Klicken Sie in
<div>
Bereich - Typ "123"
- Backspace "3" Backspace "- 2" Backspace "- 1"
Einzelheiten In Bezug Auf Die
Erforschung dieses ausgiebig, ich bin gekommen, über verschiedene Frage ALSO, die ähnlich sind, aber in Anlehnung an den zugehörigen Lösungen hat sich nicht die silberne Kugel, die ich bin nach. Auch habe ich die Fragen für das Chrome-Projekt, die scheinen Ziel (vielleicht nicht in der genauen Art und Weise) das oben beschriebene Problem und kann eingesehen werden unter.
- Problem 384357: Cursor-position innerhalb contenteditable region mit Knoten nicht bearbeitbar,
- Problem 385003: Legen Sie die caret-Stil ist falsch, wenn du das Ende einer Zeile in einer contenteditable-element
- Problem 71598: Cursor in der falschen Stellung nach nicht-editierbare element am Ende der contentEditable
Den nächsten, SO dass die Lösung, die ich gefunden habe werden können hier. Die Idee bei dieser Lösung ist, um ‌
Zeichen nach der <span>
Elemente, aber wenn ich jetzt löschen, meine <span>
ich stattdessen löschen Sie die ‌
... zwingt mein cursor springt an das Ende, bietet eine seltsame UI-Erfahrung, indem Sie nicht löschen meine <span>
auf meine "erste entf-Taste Schlaganfall."
Frage
Hat jemand Erfahrung mit diesem Problem und fand eine Arbeit um? Ich begrüße jede mögliche Lösung, sogar als JS hacky, wie Sie kommen. Ich bin gekommen, um zu erfahren, dass die Nutzung contenteditable
kommt mit einer Wäscherei Liste der Kampf, aber das scheint das Letzte Verbleibende Schwierigkeit, die ich derzeit haben.
- Welche version von Chrome benutzen Sie? Ich bin mit Chrome 39 und kann nicht reproduzieren Sie das Problem. Wenn ich löschen Sie die nicht-contenteditable
span
s, die Cursor-position bleibt die gleiche. - Ich habe einige detaillierte fiddle Unterricht mit meiner Chrome version. Das Problem ist für folgenden text die
<span>
. Bitte lassen Sie mich wissen, wenn diese Angaben helfen - Chrome 39.0.2171.95 (Linux 64-bit) - nicht sehen können, einen solchen glitch
- sind Sie in der Lage, führen Sie das Beispiel auf einem Windows-Rechner?
- Sorry, ich habe kein Windows.
- Nach folgenden neuen Beispiel, kann ich es auch sehen. Wenn Sie das Kontrollkästchen Entwicklertools, es hält auch das hinzufügen
""
anstelle von "schreiben in der gleichen Zeichenfolge", es sieht aus wie es eine neue erstellt jedes mal, wenn der Benutzer schreibt. Es ist komisch. - Richtig!!!! Es ist komisch, auch, wenn Sie sich bewegen, mit nach Links und rechts und halten Sie Konto, wo Sie sein "sollte", und geben Sie.. es ist in der richtigen Stelle, aber cursor scheint die "Verzögerung eine Bewegung, die hinter" in diesem Fall. Ich habe auf einer hacky workaround werde ich später, falls Sie sind interessiert zu sehen, eine mögliche Lösung für dieses
- Sind Sie versuchen, neu zu erstellen, den Effekt, dass Twitter hat sich beim @ jemand in den tweet?
- Etwas sehr ähnliches. Ich habe die Lösung, wie ich wünschte, mit Ausnahme für dieses kleine Problem in Chrome. Haben Sie eine ähnliche Arbeit?
- Ja, ich habe versucht, es neu zu erstellen mich und fand eine Menge von Ungereimtheiten. Nichts wie deiner obwohl. Hatten Sie einen Lesevorgang durch diese: github.com/guardian/scribe/blob/master/... ? Vielleicht könnte Ihnen das helfen.
- Immer noch keine Antwort, nur ein Interessantes Verhalten. Wenn Sie hinzufügen ein pseudo-element, um die Spannweiten, die mit einem Leerzeichen als Inhalt es ist, sehen Sie, dass die Letzte Spanne nicht vergeben werden, bis es gibt einige Charaktere vor. jsfiddle.net/41mo9xxd/11 vielleicht nicht sinnvoll.. einfach nur interessant?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, warum dies passiert, aber ich hatte das Gefühl, es hat etwas zu tun mit der Dimensionierung der
<div>
, also versuchte ich das Spiel mit derdisplay
Eigenschaft. Nachdem Sie es aufinline-block
und spielen ein wenig mit dem text habe ich gefunden, dass das Problem verschwunden, nachdem ich einige änderungen an der it, insbesondere das hinzufügen einer neuen Zeile.Sah ich, dass aus irgendeinem Grund, das
<br/>
tag ist gehalten, indiv.main
nachdem ich löschen meine neue Zeile, aber das Aussehen der<div>
und die Art und Weise, es reagiert auf die Pfeiltasten ist das gleiche wie wenn es keine neue Zeile.Also habe ich neu gestartet das man mit der CSS zu ändern und ein
<br/>
tag indiv.main
und viola!Also zu dem Schluss:
display: inline-block
zudiv.main
<br/>
am Endediv.main
JSFiddle Link
Das problem ist, dass Ihr
contenteditable
element ist eindiv
werden, welche standardmäßigdisplay: block
. Dies ist, was bewirkt, dass Ihr Cursor-position problem. Dies kann behoben werden, indem die äußerstendiv
nicht-editierbare und das hinzufügen eines neuen bearbeitbarendiv
behandelt wird, alsinline-block
.Den neuen HTML-hätte eine neue
div
nur innerhalb der äußeren (und die entsprechende schließende tag am Ende):Und fügen Sie diese in Ihre CSS:
Willen zu sehen, die Einfügemarke besser, wenn es zwischen
span
Elemente, außerdem habe ichmargin: 2px
der Regel fürdiv.main span
im CSS, aber das ist nicht notwendig, um zu verhindern, dass die Einfügemarke springt Ausgabe berichtet, in Frage stellen.Hier ist ein fiddle.
Als Sie begonnen haben zu entdecken,
contenteditable
behandelt wird inkonsistent zwischen den Browsern. Ein paar Jahre zurück, ich begann die Arbeit an einem Projekt (in-browser XML-editor) wo ich dachtecontenteditable
würde alles einfacher machen. Dann, als ich entwickelte die Anwendung, ich fand mich bald übernehmen die Funktionen, die ich dachtecontenteditable
mir geben würde, kostenlos. Heute die einzige Sache, diecontenteditable
mir ist, dass sich auf Tastatur-Ereignisse auf Elemente, die ich Bearbeiten möchte. Alles andere, inklusive Cursor-Bewegung und caret-Zeichen angezeigt, verwaltet durch benutzerdefinierten code.<span>
element, verschwindet es. Chrome Version39.0.2171.95 m
span
aber ich weiß nicht, von einer reinen CSS-Lösung dafür.display: inline-block
dem contenteditable div) löst mein problem. Ich verbrachte viel Zeit mit der Suche nach einer Lösung. Ich danke Ihnen so sehr.So, ich habe eine etwas sauberere Umsetzung Ihres Ansatzes, der sich auf die
input
Ereignis, das ausgelöst wird, wenn eincontenteditable
Feld aktualisiert wird. Dieses Ereignis wird nicht unterstützt von IE, aber es sieht aus wiecontenteditable
ist ziemlich wackelig im IE sowieso.Es im Grunde injiziert Elemente, um jedes element gekennzeichnet wie
contenteditable="false"
. Es konnte wahrscheinlich gemacht werden, auf erste laden, anstatt nur auf dieinput
Ereignis, aber ich dachte, Sie könnte Möglichkeiten haben, injizieren mehrspan
's um die region, soinput
sollten für dieses Konto.Einschränkungen umfassen einige seltsame Verhalten rund um die Pfeil-Tasten, wie Sie gesehen haben selbst. Vor allem, was ich gesehen habe ist, dass der cursor behält seine richtige position, wenn Sie rückwärts durch die überspannt, aber nicht, wenn Sie vorwärts zu bewegen.
JSFiddle Link
Javascript
CSS
<span>
's voll und ganz, aber es ist komisch.. nur das Letzte scheint wichtig zu sein. Wenn Sie ausführen, meine Geige nur mit der<i>
auf das Ende, dann gehen Sie in zwischen einige der anderen<span>
's und versuchen Sie die Eingabe/löschen von text, alles ist in Ordnung. Für deinen code-snippet, ich lief die fiddle und eingefügt, dass in, und die Verpackung ist immer auf jedeminput
Habe ich eine gefunden hacky Weise zu lösen, die ersten problem der cursor Fehlverhalten am Ende der
<div>
mit einigen JQuery. Ich bin grundsätzlich einfügen einer leeren<i>
für den cursor zu "Riegel" auf, um am Ende der<div>
Inhalt. Dieser tag funktioniert für mich, weil es keine UI Unterschied für den Endbenutzer, wenn die Umsteuerung dieser vom normalen text durch überschreibenfont-style: normal
(siehe fiddle), und ich musste auch mal etwas anderes als<span>
einfügenIch bin nicht besonders begeistert mit dieser Problemumgehung, vor allem die Wahl einer
<i>
nur da, aber ich bin nicht gekommen, über eine bessere alternative, und ich immer noch offen für bessere Lösungen - wenn vorhanden!. Ich Plane, weiter zu arbeiten an diesem, um hoffentlich herauszufinden, die Pfeil-Tasten als gut, aber zum Glück bin ich nur gestört durch diese Panne in der Fiddle und nicht mein code.Geige (Chrome only)
Fügen Sie einfach eine neue Zeile char (
\n
) vor dem schließen dercontenteditable
tag.Zum Beispiel in JavaScript:
var html = '<div id="main" contenteditable="true">' + content + "\n" + '</div>'