Disons:
<div>
pre text
<div class="remove-just-this">
<p>child foo</p>
<p>child bar</p>
nested text
</div>
post text
</div>
pour ça:
<div>
pre text
<p>child foo</p>
<p>child bar</p>
nested text
post text
</div>
J'ai compris en utilisant Mootools, jQuery et même JavaScript (brut), mais je n'ai pas pu comprendre comment faire cela.
javascript
dom
cheeaun
la source
la source
$('.remove-just-this').replaceWith(function() { return $(this).html(); });
La méthode indépendante de la bibliothèque consiste à insérer tous les nœuds enfants de l'élément à supprimer avant lui-même (ce qui les supprime implicitement de leur ancienne position), avant de le supprimer:
Cela déplacera tous les nœuds enfants au bon endroit dans le bon ordre.
la source
node.replaceWith(...node.childNodes);
Vous devez vous assurer de le faire avec le DOM, non
innerHTML
(et si vous utilisez la solution jQuery fournie par jk, assurez-vous qu'elle déplace les nœuds DOM plutôt que de l'utiliser eninnerHTML
interne), afin de préserver des choses comme les gestionnaires d'événements.Ma réponse ressemble beaucoup à celle des insin, mais fonctionnera mieux pour les grandes structures (l'ajout de chaque nœud séparément peut être pénible pour les redessins où CSS doit être réappliqué pour chacun
appendChild
; avec unDocumentFragment
, cela ne se produit qu'une fois car il n'est rendu visible qu'après son les enfants sont tous ajoutés et il est ajouté au document).la source
la source
Une manière plus élégante est
la source
Utilisez JS moderne!
oldNode.replaceWith(newNode)
est valide ES5...array
est l'opérateur de diffusion, passant chaque élément du tableau en tant que paramètrela source
Quelle que soit la bibliothèque que vous utilisez, vous devez cloner le div interne avant de supprimer le div externe du DOM. Ensuite, vous devez ajouter le div interne cloné à l'endroit dans le DOM où se trouvait le div externe. Les étapes sont donc:
innerHTML
de la div interne dans une variable ou vous pouvez copier l'arborescence interne de manière récursive nœud par nœud.removeChild
le parent du div externe avec le div externe comme argument.Certaines bibliothèques feront tout ou partie de cela pour vous, mais quelque chose comme ce qui précède se passera sous le capot.
la source
Et, puisque vous avez également essayé dans mootools, voici la solution dans mootools.
Notez que ce n'est pas du tout testé, mais j'ai déjà travaillé avec mootools et cela devrait fonctionner.
http://mootools.net/docs/Element/Element#Element:getChildren
http://mootools.net/docs/Element/Element#Element:replaces
la source
Remplacez div par son contenu:
la source
si vous souhaitez faire la même chose en pyjama, voici comment procéder. ça marche très bien (merci à la paupière). J'ai pu créer un éditeur de texte riche approprié qui fait correctement les styles sans gâcher, grâce à cela.
la source
pyjamas
.Je cherchais la meilleure réponse en termes de performances tout en travaillant sur un DOM important.
La réponse de eyelidness soulignait qu'en utilisant javascript les performances seraient les meilleures.
J'ai fait les tests de temps d'exécution suivants sur 5 000 lignes et 400 000 caractères avec une composition DOM complexe dans la section à supprimer. J'utilise un identifiant au lieu d'une classe pour des raisons pratiques lorsque j'utilise javascript.
Utiliser $ .unwrap ()
Utiliser $ .replaceWith ()
Utilisation de DocumentFragment en javascript
Conclusion
Sur le plan des performances, même sur une structure DOM relativement grande, la différence entre l'utilisation de jQuery et de javascript n'est pas énorme. Étonnamment,
$.unwrap()
c'est plus cher que$.replaceWith()
. Les tests ont été effectués avec jQuery 1.12.4.la source
Si vous avez affaire à plusieurs lignes, comme c'était le cas dans mon cas d'utilisation, vous êtes probablement mieux avec quelque chose du genre:
la source