Legen Sie die caret-position in contenteditable div

Intro

Beim Bearbeiten der Inhalt einer contenteditable DOM-Objekt, verschiedene Browser haben unterschiedliche Verhaltensweisen. Zum Beispiel, Firefox 18.0 wird ein neuer Absatz erstellt (<p>) oder einen Zeilenumbruch <br/> in einigen Fällen, während Chrome 24 erstellt ein <div>.

Um das zu bewältigen, ich höre die DOMNodeInserted Veranstaltung und Austausch der neu eingefügten Knoten mit p-tags.


Problem

Das problem ist, platzieren Sie die Einfügemarke im Ort. Ich gelesen habe Tonnen von posts in SO in Bezug auf das gleiche Thema, aber keine der Antworten gearbeitet haben, zumindest in Chrome 24.


Code

JSFiddle

obj.addEventListener("DOMNodeInserted", onNodeInsert, false);

function onNodeInsert(e) {
    var range    = document.createRange(),
        sel      = window.getSelection(),
        newNode  = e.target,
        tagName  = newNode.tagName.toLowerCase(),
        lnbrNode = document.createElement('br'),
        pNode    = document.createElement('p');

    if (tagName === 'div' && newNode.getAttribute("id") === null) {
        //First we remove the event listener so that it doesn't get triggered again
        this.removeEventListener('DOMNodeInserted', onNodeInsert, false);

        //Creates a p node and removes the div
        newNode.parentNode.replaceChild(pNode, newNode);
        pNode.appendChild(lnbrNode);

        //Places the caret where it belongs
        range.setStart(pNode, 0);
        sel.removeAllRanges();
        sel.addRange(range);    

        //We can restore the event listener now
        this.addEventListener("DOMNodeInserted", onNodeInsert, false);
    }
}
  • WebKit einfach nicht lassen, Sie platzieren Sie den Cursor einfach überall: es wird immer normalisieren und die position des Einfügezeichens auf eine position, die er der Auffassung ist gültig. Die einzige Lösung ist, es zu hacken, mit null-Breite Leerzeichen oder etwas noch mehr grim. Siehe bugs.webkit.org/show_bug.cgi?id=23189
  • Vielen Dank für Ihren Kommentar. Scheint in webkit-es ist flawed by design. Mein workaround für das bestimmte Problem, das Sie erwähnt wurde, immer erstellen Sie ein Absatz-tag am Anfang des Textes, Denn das ist eigentlich das gewünschte Verhalten für dieses Projekt.
  • Können Sie bitte erklären Sie das hack für webkit? oder wenigstens einen link, das erklärt die gleiche.
  • Der hack wäre, ein zero-width space character (Unicode U+200B), entweder durch hinzufügen eines neuen text-Knoten oder das einfügen in eine vorhandene, auf die position, die Sie möchten, platzieren Sie den Cursor, und positionieren Sie dann den Cursor unmittelbar nach dem " zero-width space. Der Benutzer wird keinen Unterschied (es sei denn, Sie verwenden die Pfeil-Links-Taste). Sie haben dann das problem der Beseitigung dieser Raum nachher, wenn es nicht mehr notwendig ist.
  • Ich bin wirklich neu auf all dieses Zeug. lernen langsam.. Kannst du bitte mich direkt zu einem deiner links erklärt sich der gleichen?
InformationsquelleAutor Tivie | 2013-01-15
Schreibe einen Kommentar