167 votes

Suppression d'une balise HTML mais conservation de l'innerHtml

J'ai du HTML simple que je dois dépouiller d'un formatage simple.

A nice house was found in <b>Toronto</b>.

Je dois enlever le gras, mais laisser la phrase intacte.

Comment cela est-il possible dans jQuery ?

324voto

user113716 Points 143363
$('b').contents().unwrap();

Cela sélectionne tous les <b> éléments, alors utilise .contents() pour cibler le contenu textuel du <b> , puis .unwrap() pour supprimer son parent <b> élément.


Pour obtenir les meilleures performances, il faut toujours opter pour le mode natif :

var b = document.getElementsByTagName('b');

while(b.length) {
    var parent = b[ 0 ].parentNode;
    while( b[ 0 ].firstChild ) {
        parent.insertBefore(  b[ 0 ].firstChild, b[ 0 ] );
    }
     parent.removeChild( b[ 0 ] );
}

Ce sera beaucoup plus rapide que toute solution jQuery fournie ici.

2 votes

+1 J'étais assis là à écrire une réponse presque identique concernant unwrap() et je n'arrivais pas à me rappeler comment obtenir la partie texte, j'avais oublié .contents() - excellent.

2 votes

Bien que cela fonctionne, c'est aussi assez lent comparé à .replacewith() à cause de la traversée supplémentaire du DOM... si c'est une <b> avec seulement du HTML, cela devient encore plus rapide.

0 votes

De même, si vous souhaitez simplement dérouler un span ou une balise de police spécifique, vous pouvez procéder comme suit : $(".className font").contents().unwrap() ;

55voto

Nick Craver Points 313913

Vous pouvez également utiliser .replaceWith() comme ceci :

$("b").replaceWith(function() { return $(this).contents(); });

Ou si vous savez que c'est juste une chaîne :

$("b").replaceWith(function() { return this.innerHTML; });

Cela peut faire une grande différence si vous déballez beaucoup d'éléments, puisque l'une ou l'autre des approches ci-dessus est sensiblement plus rapide que le coût de .unwrap() .

0 votes

Nick, j'aime beaucoup ta réponse aussi. J'ai choisi l'autre parce que la quantité de tags/texte que j'utiliserai dans mon application iPad (données locales) est faible et que les performances ne sont pas trop importantes. La réponse de Partick est un peu plus simple à gérer pour moi. Je coupe les cheveux en quatre pour deux excellentes solutions, mais je ne pouvais en donner qu'une seule à vérifier.

1 votes

@BahaiResearch.com - Si la performance n'est pas un problème, il faut absolument faire simple... Je fournis juste cette information pour ceux qui la découvrent plus tard et qui pourraient être concernés :)

0 votes

J'ai essayé d'utiliser cet exemple avec une zone de texte, mais je n'y arrivais pas parce que le contenu de la zone était constitué de balises html qui devaient être évaluées et pas seulement affichées comme du texte. J'ai fini par utiliser : $('textarea').replaceWith(function(){return $(this).val();}) ;

14voto

WebChemist Points 2545

La manière la plus simple de supprimer les éléments html internes et de ne renvoyer que du texte serait la suivante Fonction JQuery .text() .

Ejemplo:

var text = $('<p>A nice house was found in <b>Toronto</b></p>');

alert( text.html() );
//Outputs A nice house was found in <b>Toronto</b>

alert( text.text() );
////Outputs A nice house was found in Toronto

Démonstration de jsFiddle

9voto

izzulmakin Points 430

Regardez, car la réponse la plus simple est époustouflante :

outerHTML est pris en charge jusqu'à Internet Explorer 4 !

Voici comment le faire avec javascript même sans jQuery

element.outerHTML = element.innerHTML

avec jQuery

var element = $('b')[0];
element.outerHTML = element.innerHTML;

ou sans jQuery

var element = document.querySelector('b');
element.outerHTML = element.innerHTML

Si vous le voulez comme une fonction :

function unwrap(selector) {
    var nodelist = document.querySelectorAll(selector);
    Array.prototype.forEach.call(nodelist, function(item,i){
        item.outerHTML = item.innerHTML; // or item.innerText if you want to remove all inner html tags 
    })
}

unwrap('b')

Cela devrait fonctionner dans tous les principaux navigateurs, y compris l'ancien IE.

Si vous obtenez NoModificationAllowedError o DOMException cela signifie que l'élément n'a pas de parent. Habituellement, vous obtenez ce résultat lorsque vous essayez de répondre en créant un nouveau nœud à partir de la console javascript sans le placer comme enfant d'un autre élément. Mais ne vous inquiétez pas et rappelez-vous que tout élément dans le document a au moins un parent ( <html></html> élément)


NOTE :

cela réécrit le innerHTML, de sorte que si vous avez une variable faisant référence à l'élément interne, elle ne pointera pas sur le même élément.

Si vous devez conserver la référence de certains éléments internes dans votre codage, vous pouvez utiliser jQuery (première réponse) qui déplace les éléments à la position attendue sans réécrire l'élément.

5voto

Toastrackenigma Points 55

Que pensez-vous de ça ?

$("b").insertAdjacentHTML("afterend",$("b").innerHTML);
$("b").parentNode.removeChild($("b"));

La première ligne copie le contenu HTML de la page b à l'emplacement situé directement après la balise b puis la deuxième ligne supprime la balise b du DOM, ne laissant que son contenu copié.

Normalement, j'intègre cette fonction pour en faciliter l'utilisation :

function removeElementTags(element) {
   element.insertAdjacentHTML("afterend",element.innerHTML);
   element.parentNode.removeChild(element);
}

L'ensemble du code est en fait du pur Javascript, le seul JQuery utilisé est celui qui permet de sélectionner l'élément à cibler (la balise b dans le premier exemple). La fonction est juste du pur JS :D

Regardez aussi :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X