Comment faire pour supprimer uniquement l'élément parent, et non ses éléments enfant en JavaScript?
Disons:
<div>
pre text
<div class="remove-just-this">
<p>child foo</p>
<p>child bar</p>
nested text
</div>
post text
</div>
à ceci:
<div>
pre text
<p>child foo</p>
<p>child bar</p>
nested text
post text
</div>
J'ai essayé d'utiliser Mootools, jQuery et même (raw) en JavaScript, mais je ne pouvais pas avoir l'idée de comment faire cela.
Vous devez vous connecter pour publier un commentaire.
À l'aide de jQuery vous pouvez faire ceci:
Rapide des liens vers la documentation:
jQuery.unwrap
$('.remove-just-this').replaceWith(function() { return $(this).html(); });
node.replaceWith(...node.childNodes);
La bibliothèque indépendant de la méthode consiste à insérer tous les nœuds enfants de l'élément à être retiré avant de lui-même (ce qui implicitement les retire de leur ancienne position), avant de la retirer:
Cela vous permettra de déplacer tous les nœuds enfants à la bonne place dans le bon ordre.
node.replaceWith(...node.childNodes);
Assurez-vous de le faire avec le DOM, pas
innerHTML
(et si l'utilisation de jQuery solution fournie par jk, assurez-vous qu'il déplace les nœuds DOM, plutôt que d'utiliserinnerHTML
en interne), afin de préserver les choses comme les gestionnaires d'événements.Ma réponse est un peu comme insin, mais fonctionnera mieux pour les grandes structures (ajout à la fin de chaque nœud séparément peut être éprouvant, redessine où le CSS doit être renouvelée pour chaque
appendChild
; avec unDocumentFragment
, cela se produit uniquement une fois qu'il n'est pas visible jusqu'à ce que après que ses enfants sont tous ajoutés et il est ajouté au document).Façon plus élégante est
Utiliser les technologies modernes de JS!
oldNode.replaceWith(newNode)
est valable ES5...array
est la propagation de l'opérateur, en passant chaque élément du tableau comme paramètreLa librairie que vous utilisez, vous devez cloner l'intérieur de la div avant de retirer la div extérieure de la DOM. Ensuite, vous devez ajouter la cloné à l'intérieur de la div à la place dans les DOM où la div extérieure est. Les étapes sont les suivantes:
innerHTML
de l'intérieur de la div à une variable ou vous pouvez copier l'intérieur de l'arbre de façon récursive de nœud en nœud.removeChild
à l'extérieur sur le div parent avec l'extérieur div comme argument.Certaines bibliothèques se faire une partie ou de tout pour vous, mais quelque chose comme ci-dessus sera se cache sous le capot.
Et, depuis que vous avez essayé dans mootools ainsi, voici la solution en mootools.
Remarque que c'est totalement non testé, mais j'ai travaillé avec mootools avant et cela devrait fonctionner.
http://mootools.net/docs/Element/Element#Element:getChildren
http://mootools.net/docs/Element/Element#Element:replaces
si vous souhaitez faire la même chose en pyjama, et voici comment il est fait. il fonctionne très bien (merci à eyelidness). j'ai été en mesure de faire un bon éditeur de texte riche qui ne les styles sans déconner, grâce à cette.
pyjamas
.Je cherchais la meilleure réponse de performance tout en travaillant sur un important DOM.
eyelidlessness a répondu en soulignant que l'utilisation de javascript, les performances seraient meilleures.
J'ai pris les temps d'exécution des tests sur de 5 000 lignes et 400 000 caractères avec un complexe DOM composition à l'intérieur de la section à supprimer. Je suis à l'aide d'un ID au lieu d'une classe pour la pratique de la raison lors de l'utilisation de javascript.
À l'aide de $.unwrap()
À l'aide de $.remplaceavec()
À l'aide de DocumentFragment en javascript
Conclusion
De Performance, même sur une relativement grosse DOM structure, la différence entre l'utilisation de jQuery et javascript n'est pas énorme. Étonnamment
$.unwrap()
est plus coûteux que$.replaceWith()
.Les tests ont été fait avec jQuery 1.12.4.
Si vous travaillez avec plusieurs lignes, comme il était dans mon cas d'utilisation, vous êtes probablement mieux avec quelque chose le long de ces lignes:
Remplacer div avec son contenu:
JS:
HTML: