2009-09-02 14 views
5

Se ho qualche HTML che assomiglia a questo:Rimuovi tag intorno a un nodo di testo utilizzando JavaScript

<div id="text"> 
     This is some text that is being written <span class="highlight">with 
     a highlighted section</span> and some text following it. 
</div> 

E voglio rimuovere il "span" lasciando il nodo di testo all'interno, come dovrei andare a fare che ? Ho provato ad utilizzare jQuery per effettuare le seguenti operazioni:

wrap = $('.highlight'); 
wrap.children().insertBefore(wrap); 
wrap.remove(); 

Ma questo non funziona sto cercando di indovinare perché i bambini restituisce un insieme vuoto poiché c'è solo un nodo di testo in là. Quindi tutto ciò che accade è che lo span e il suo contenuto vengono rimossi.

Sono anche aperto a alternative al mio approccio qui. Quello che sta succedendo è che il mio codice crea effettivamente quell'intervallo quando un utente seleziona un blocco di testo. Incapsula il testo selezionato in un intervallo per differenziarlo visivamente. Ho bisogno di rimuovere lo span dopo, a causa di alcune stranezze nel modo in cui funziona l'oggetto range di mozilla.

EDIT: Non voglio sostituire l'intero contenuto di "#text" in quanto potrebbe essere molto grande.

risposta

18

Si ottiene il testo, e sostituire l'arco con esso:

var wrap = $('.highlight'); 
var text = wrap.text(); 
wrap.replaceWith(text); 
0

text.replace (/ < /? [^>] + (> | $)/G, "");

+0

Ah, le espressioni regolari. Non ne ho mai incontrato uno che non facesse piangere il mio cervello. Ma questo è un buon approccio. Basta sostituire l'html interno con i risultati di una regex. Mi piace. – Karim

+0

È meglio non usare mai espressioni regolari per (X) (HT) ML in quanto non si tratta di lingue normali. comunque in questo caso quanto sopra dovrebbe funzionare. –

+0

-1 Rimuove i tag, ma non nel modo specificato dall'OP. – Imagist

3

Questo funziona:

wrap = $('.highlight'); 
wrap.before(wrap.text()); 
wrap.remove(); 
+0

Motivo del downvote? Ho provato questo su Google AJAX Playground per jQuery e ha funzionato ... –

+0

+1 - funziona davvero - fai clic sulla scheda di output - http://jsbin.com/iqola/edit –

3

questo farà quello che vuoi, e anche preservare eventuali tag nell'arco EVIDENZA .

content = $(".highlight").contents(); 
$(".highlight").replaceWith(content); 
0

sarebbe molto più semplice cambiare semplicemente la classe dello span piuttosto che rimuoverlo effettivamente. È possibile utilizzare puro javascript: funzione toggleClass

document.getElementById("span id").className=""; 

O di jQuery:

$("element").toggleClass("highlight"); 

Inoltre, le migliori pratiche dicono che non si dovrebbe usare nomi di classe che implicano uno stile, come il punto culminante. Prova invece "enfatizzato". : D

+0

sì, purtroppo lo span deve essere rimosso a causa della stranezza con l'oggetto intervallo menzionato. – Karim

6

avvolgerlo in un plugin

(function($) { 
    $.fn.tagRemover = function() {   
     return this.each(function() {    
     var $this = $(this); 
     var text = $this.text(); 
     $this.replaceWith(text);    
     });    
    }  
})(jQuery); 

e quindi utilizzare in questo modo

$('div span').tagRemover(); 

Working Demo qui - aggiungere /modificare all'URL di giocare con il codice

+0

Parlare di fare il miglio supplementare ... bello. – Karim

+0

Mettere roba in un plugin è quasi sempre una buona mossa (e ora lo è) +1 –

-1

Un plug-in di scappamento migliore:

$.fn.unwrap = function() { 
    this.parent(':not(body)') 
    .each(function(){ 
     $(this).replaceWith(this.childNodes); 
    }); 

    return this; 
}; 

da Ben Alman

1
element = document.getElementById("span id"); 
element.parentNode.insertBefore(element.firstChild, element); 
element.parentNode.removeChild(element); 
Problemi correlati