Sagen wir:
<div>
pre text
<div class="remove-just-this">
<p>child foo</p>
<p>child bar</p>
nested text
</div>
post text
</div>
dazu:
<div>
pre text
<p>child foo</p>
<p>child bar</p>
nested text
post text
</div>
Ich habe es mit Mootools, jQuery und sogar (rohem) JavaScript herausgefunden, konnte aber nicht auf die Idee kommen, wie das geht.
javascript
dom
cheeaun
quelle
quelle
$('.remove-just-this').replaceWith(function() { return $(this).html(); });
Die bibliotheksunabhängige Methode besteht darin, alle untergeordneten Knoten des zu entfernenden Elements vor sich selbst einzufügen (wodurch sie implizit von ihrer alten Position entfernt werden), bevor Sie es entfernen:
Dadurch werden alle untergeordneten Knoten in der richtigen Reihenfolge an die richtige Stelle verschoben.
quelle
node.replaceWith(...node.childNodes);
Sie sollten sicherstellen, dass Sie dies nicht mit dem DOM tun
innerHTML
(und wenn Sie die von jk bereitgestellte jQuery-Lösung verwenden, stellen Sie sicher, dass die DOM-Knoten verschoben werden, anstatt sieinnerHTML
intern zu verwenden), um Dinge wie Ereignishandler beizubehalten.Meine Antwort ähnelt der von insin, ist jedoch für große Strukturen besser geeignet (das Anhängen jedes Knotens kann eine Belastung für Neuzeichnungen darstellen, bei denen CSS für jeden erneut angewendet werden muss
appendChild
; mit aDocumentFragment
tritt dies nur einmal auf, da es erst nach seiner Darstellung sichtbar gemacht wird Kinder werden alle angehängt und dem Dokument hinzugefügt.quelle
quelle
Eleganter ist der Weg
quelle
Verwenden Sie moderne JS!
oldNode.replaceWith(newNode)
ist gültig ES5...array
ist der Spread-Operator, der jedes Array-Element als Parameter übergibtquelle
Unabhängig davon, welche Bibliothek Sie verwenden, müssen Sie das innere Div klonen, bevor Sie das äußere Div aus dem DOM entfernen. Dann müssen Sie das geklonte innere Div an der Stelle im DOM hinzufügen, an der sich das äußere Div befand. Die Schritte sind also:
innerHTML
das innere Div in einer Variablen gespeichert wird, oder Sie können den inneren Baum Knoten für Knoten rekursiv kopieren.removeChild
das Elternteil des äußeren Div mit dem äußeren Div als Argument auf.Einige Bibliotheken erledigen dies ganz oder teilweise für Sie, aber so etwas wird unter der Haube passieren.
quelle
Und da Sie es auch mit Mootools versucht haben, finden Sie hier die Lösung für Mootools.
Beachten Sie, dass dies völlig ungetestet ist, aber ich habe bereits mit Mootools gearbeitet und es sollte funktionieren.
http://mootools.net/docs/Element/Element#Element:getChildren
http://mootools.net/docs/Element/Element#Element:replaces
quelle
Ersetzen Sie div durch seinen Inhalt:
quelle
Wenn Sie dasselbe im Pyjama machen möchten, gehen Sie wie folgt vor. es funktioniert super (danke an die Augenlider). Dank dessen konnte ich einen richtigen Rich-Text-Editor erstellen, der Stile richtig macht, ohne es zu vermasseln.
quelle
pyjamas
.Ich suchte nach der besten Antwort in Bezug auf die Leistung, während ich an einem wichtigen DOM arbeitete.
Die Antwort von eyelidlessness war, darauf hinzuweisen, dass die Aufführungen mit Javascript am besten wären.
Ich habe die folgenden Ausführungszeittests für 5.000 Zeilen und 400.000 Zeichen mit einer komplexen DOM-Komposition innerhalb des zu entfernenden Abschnitts durchgeführt. Ich verwende aus praktischen Gründen eine ID anstelle einer Klasse, wenn ich Javascript verwende.
Verwenden von $ .unwrap ()
Verwenden von $ .replaceWith ()
Verwenden von DocumentFragment in Javascript
Fazit
In Bezug auf die Leistung ist der Unterschied zwischen der Verwendung von jQuery und Javascript selbst bei einer relativ großen DOM-Struktur nicht groß. Überraschenderweise
$.unwrap()
ist am teuersten als$.replaceWith()
. Die Tests wurden mit jQuery 1.12.4 durchgeführt.quelle
Wenn Sie mit mehreren Zeilen arbeiten, wie es in meinem Anwendungsfall der Fall war, sind Sie wahrscheinlich mit etwas in dieser Richtung besser dran:
quelle