Rimuovi un tag HTML ma mantieni il codice HTML interno


148

Ho del semplice HTML di cui ho bisogno per eliminare la formattazione semplice.

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

Devo rimuovere il grassetto, ma lasciare intatta la frase.

Come è possibile in jQuery?

Risposte:


302
$('b').contents().unwrap();

Questo seleziona tutti gli <b>elementi, quindi utilizza.contents() come target il contenuto del testo di <b>, quindi.unwrap() rimuove il suo <b>elemento genitore .


Per le migliori prestazioni, diventa sempre nativo:

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 ] );
}

Questo sarà molto più veloce di qualsiasi soluzione jQuery fornita qui.


1
+1 Ero seduto lì a scrivere una risposta quasi identica per quanto riguarda unwrap()e non riuscivo a ricordare come ottenere la parte di testo, ho dimenticato .contents()- eccellente.
Orbling

2
Mentre funziona, è anche abbastanza lento rispetto a .replacewith()causa del traversal DOM aggiuntivo ... se è un <b>tag con solo HTML diventa ancora più veloce.
Nick Craver

Inoltre, se vuoi semplicemente scartare un intervallo specifico o un tag font, potresti fare qualcosa del genere: $ (". ClassName font"). Contents (). Unwrap ();
Steve Cochrane,

se HTML è <div> abc </div> la linea di interruzione abc non regge? come posso tenerlo se uso <div> per la linea di interruzione? @ user113716
Hoa.Tran

1
Grazie, è stato molto utile. Ho aggiunto parent.normalize()dopo parent.removeChild(...per unire i nodi di testo adiacenti. Ciò è stato utile se si modifica continuamente la pagina.
Justin Harris,

52

Puoi anche usare .replaceWith(), in questo modo:

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

O se sai che è solo una stringa:

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

Questo può fare una grande differenza se stai scartando molti elementi poiché uno dei due approcci sopra è significativamente più veloce del costo di .unwrap().


Nick, mi piace molto anche la tua risposta. Ho scelto l'altro perché la quantità di tag / testo che userò per questo nella mia app per iPad (dati locali) è piccola, quindi le prestazioni non sono troppo importanti. La risposta di Partick è un po 'più semplice per me da mantenere. Dividere i peli in 2 grandi soluzioni, ma ho potuto dare solo uno al controllo.
Ian Vink,

1
@ BahaiResearch.com - Se le prestazioni non sono un problema, allora diventa assolutamente semplice ... Sto solo fornendo questo per altri che lo troveranno in seguito che potrebbero esserne preoccupati :)
Nick Craver

Stavo cercando di usare questo esempio con una casella di testo ma mi stava uccidendo perché il contenuto all'interno era tag html che volevo valutare e non solo visualizzato come testo. Ho finito per usare: $ ('textarea'). ReplaceWith (function () {return $ (this) .val ();});
Will Sampson,

13

Il modo più semplice per rimuovere elementi html interni e restituire solo testo sarebbe la funzione .text () di JQuery .

Esempio:

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

jsFiddle Demo


5

Cosa ne pensi di questo?

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

La prima riga copia il contenuto HTML del btag nella posizione direttamente dopo il btag, quindi la seconda riga rimuove il btag dal DOM, lasciando solo i contenuti copiati.

Normalmente lo avvolgo in una funzione per facilitarne l'uso:

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

Tutto il codice è in realtà puro Javascript, l'unico JQuery utilizzato è quello di selezionare l'elemento di destinazione (il btag nel primo esempio). La funzione è semplicemente JS: D

Guarda anche:


3
// For MSIE:
el.removeNode(false);

// Old js, w/o loops, using DocumentFragment:
function replaceWithContents (el) {
  if (el.parentElement) {
    if (el.childNodes.length) {
      var range = document.createRange();
      range.selectNodeContents(el);
      el.parentNode.replaceChild(range.extractContents(), el);
    } else {
      el.parentNode.removeChild(el);
    }
  }
}

// Modern es:
const replaceWithContents = (el) => {
  el.replaceWith(...el.childNodes);
};

// or just:
el.replaceWith(...el.childNodes);

// Today (2018) destructuring assignment works a little slower
// Modern es, using DocumentFragment.
// It may be faster than using ...rest
const replaceWithContents = (el) => {
  if (el.parentElement) {
    if (el.childNodes.length) {
      const range = document.createRange();
      range.selectNodeContents(el);
      el.replaceWith(range.extractContents());
    } else {
      el.remove();
    }
  }
};

1

Un'altra soluzione nativa (nel caffè):

el = document.getElementsByTagName 'b'

docFrag = document.createDocumentFragment()
docFrag.appendChild el.firstChild while el.childNodes.length

el.parentNode.replaceChild docFrag, el

Non so se sia più veloce della soluzione di user113716, ma potrebbe essere più facile da capire per alcuni.


1

La risposta più semplice è strabiliante:

outerHTML è supportato fino a Internet Explorer 4!

Ecco come farlo con javascript anche senza jQuery

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')

Questo dovrebbe funzionare in tutti i principali browser incluso il vecchio IE. nel browser recente, possiamo persino chiamare ogni elemento direttamente nella lista dei nomi.

function unwrap(selector) {
    document.querySelectorAll('b').forEach( (item,i) => {
        item.outerHTML = item.innerText;
    } )
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.