2012-07-24 8 views
15

Stellen Sie sich vor, dass ich so etwas wie die folgenden (modifiziert nach http://viralpatel.net/blogs/jquery-get-text-element-without-child-element/)Wie Text entfernen (ohne innere Elemente entfernen) von einem übergeordneten Element jquery mit

<div id="foo"> 
    first 
    <div id="bar1"> 
     jumps over a lazy dog! 
    </div> 
    second 
    <div id="bar2"> 
     another jumps over a lazy dog! 
    </div> 
    third 
</div> 

haben, wie ich (nur Text) nur entfernen“ "," zweite "und" dritte "von DOM, ohne eines der untergeordneten Elemente zu beeinflussen.

+0

http://stackoverflow.com/questions/2715167/jquery-how-to-remove-the-text-but-not-the-children -Elemente oder http://stackoverflow.com/questions/3442394/jquery-using-text-to-retrieve-only-text-not-nested-in-child-tags – kannix

+0

es hier http beantwortet wird: // stackoverflow.com/questions/6388507/use-jquery-to-select-text-not-in-an- element – fan711

+0

Die Antworten in allen verknüpften Fragen sind alle entweder völlig falsch, verursachen unerwünschte Probleme wie verlorene Ereignishandler oder brechen in bestimmten Browsern (z. Verwendung von 'nodeType' Konstanten. –

Antwort

26

Wenn Sie alle untergeordneten Textknoten entfernen möchten Sie .contents() verwenden können und dann .filter() den aufeinander abgestimmten Satz nur Textknoten zu reduzieren:

$("#foo").contents().filter(function() { 
    return this.nodeType === 3; 
}).remove();​​​​​​​ 

Hier ist ein working example.

Hinweis: Dadurch werden alle bestehenden Event-Handler für die untergeordneten Elemente, bewahren, die .html() mit Antworten werden nicht (da die Elemente aus dem DOM und wieder hinzugefügt in entfernt werden).

Anmerkung 2: Antworten in einigen der verknüpften Fragen zeigen einen ähnlichen Code wie in meiner Antwort hier, aber sie verwenden, um die nodeType Konstanten (z return this.nodeType === Node.TEXT_NODE). Dies ist eine schlechte Vorgehensweise, da IE unter Version 9 die Eigenschaft Node nicht implementiert. Es ist sicherer, die Ganzzahlen zu verwenden (die in der DOM level 2 spec gefunden werden können).

+0

Die schrecklichen '.html' Lösungen entfernen in diesem Fall keine Handler (oder tun sie das?), Aber das ist nur Zufall, weil' .html' Knoten einfügen kann (undokumentiert). Edit: Ok, sie entfernen auf jeden Fall Handler wegen der impliziten '.empty()' in '.html' – Esailija

+0

@Esailija - Die Verwendung des Codes aus der Antwort von mgraph scheint den Event-Handler zu entfernen: http://jsfiddle.net/jamesallardice/ PXxC4/1/ –

+1

Ja, du hast Recht, blöde Hirnfurz: P – Esailija

2

Sie könnten dies verwenden.

$("#foo").html($("#foo").children());​ 
+0

Dies ist der einzige, der für mich arbeitete. – zorrotmm

9

Hier ist eine nicht-jQuery-Version, die nur in allen gängigen Browsern zurück zum IE 5, arbeitet wie unscary Leben zu demonstrieren, ohne jQuery ist.

Demo: http://jsfiddle.net/timdown/aHW9J/

Code:

var el = document.getElementById("foo"), child = el.firstChild, nextChild; 

while (child) { 
    nextChild = child.nextSibling; 
    if (child.nodeType == 3) { 
     el.removeChild(child); 
    } 
    child = nextChild; 
} 
+0

gut das ist nur erschrocken mich;) –

+0

@JamieHutber: Mach dir keine Sorgen, es wird alles in Ordnung sein. –

+0

perr perrrr perr –

Verwandte Themen