Extrahieren von Text aus einem contentEditable div

Habe ich einen div gesetzt, um contentEditable und gestaltet mit "white-space:pre", also es hält Dinge wie Zeilenumbrüche. In Safari, FF und IE wird das div ziemlich viel sieht aus und funktioniert genauso. Alles ist gut. Was ich will zu tun ist, extrahieren Sie den text aus dem div, aber in einer Weise, die nicht verlieren die Formatierung -- insbesondere die Zeilenumbrüche.

Wir sind mit jQuery, deren text() Funktion grundsätzlich funktioniert ein pre-order DFS und klebt zusammen, alle Inhalte in diesem Zweig der DOM in einem einzigen Klumpen. Damit verliert die Formatierung.

Hatte ich einen Blick auf die html() Funktion, aber es scheint, dass alle drei Browsern verschiedene Dinge tun mit dem eigentlichen HTML-Code, der generiert wird hinter den kulissen in meinem contentEditable div. Vorausgesetzt, tippe ich das in mein div:

1
2
3

Dies sind die Ergebnisse:

Safari 4:

1
<div>2</div>
<div>3</div>

Firefox 3.6:

1
<br _moz_dirty="">
2
<br _moz_dirty="">
3
<br _moz_dirty="">
<br _moz_dirty="" type="_moz">

IE 8:

<P>1</P><P>2</P><P>3</P>

Pfui. Nichts sehr stimmig hier. Das überraschende ist, dass MSIE sieht die sane! (Groß P-tag und alle)

Div wird dynamisch festgelegt styling (schriftart, - Farbe, - Größe und-Ausrichtung) erfolgt über CSS, also ich bin mir nicht sicher, ob ich kann mit einer pre tag (das war angespielt auf einige Seiten, die ich gefunden mit Google).

Kennt jemand eine JavaScript-code und/oder jQuery-plugin, oder etwas, das extrahieren von text aus eine contentEditable div-so zu bewahren Zeilenumbrüche? Ich würde es vorziehen, nicht neu zu erfinden, ein parsing-Rad, wenn ich nicht muss.

Update: ich habe abgekupfert, die getText - Funktion von jQuery 1.4.2 und modifiziert Sie, um es zu entpacken mit Leerzeichen meist intakt (ich nur chnaged eine Zeile, wo ich noch eine newline);

function extractTextWithWhitespace( elems ) {
    var ret = "", elem;

    for ( var i = 0; elems[i]; i++ ) {
        elem = elems[i];

        //Get the text from text nodes and CDATA nodes
        if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
            ret += elem.nodeValue + "\n";

        //Traverse everything else, except comment nodes
        } else if ( elem.nodeType !== 8 ) {
            ret += extractTextWithWhitespace2( elem.childNodes );
        }
    }

    return ret;
}

Ich diese Funktion aufrufen und die Ausgabe verwenden, weisen Sie es zu einem XML-Knoten mit jQuery, so etwas wie:

var extractedText = extractTextWithWhitespace($(this));
var $someXmlNode = $('<someXmlNode/>');
$someXmlNode.text(extractedText);

Der resultierende XML-Code wird schließlich an einen server via AJAX-call.

Dies funktioniert auch in Safari und Firefox.

IE, nur die ersten '\n' wird wohl beibehalten, irgendwie. In Sie suchen mehr, wie es aussieht jQuery ist die Einstellung der text-wie so (line-4004 von jQuery-1.4.2.js):

return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );

Lesen auf createTextNode scheint es, dass der IE-Implementierung kann ein mash up der Leerraum. Ist dies richtig oder mache ich etwas falsch?

InformationsquelleAutor der Frage Shaggy Frog | 2010-08-11

Schreibe einen Kommentar