2009-09-02 17 views
5

Si tengo algo de HTML que tiene este aspecto:elimina etiqueta de alrededor de un nodo de texto usando 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> 

Y quiero quitar el "span" dejando el nodo de texto dentro, ¿cómo voy a ir haciendo que ? Intenté usar jQuery para hacer lo siguiente:

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

Pero eso no funciona supongo porque los niños devuelve un conjunto vacío ya que sólo hay un nodo de texto en ese país. Entonces, todo lo que sucede es que el lapso y su contenido se eliminan.

También estoy abierto a las alternativas a mi enfoque aquí. Lo que sucede es que mi código realmente crea ese lapso cuando un usuario selecciona un bloque de texto. Envuelve el texto seleccionado en un lapso para diferenciarlo visualmente. Sin embargo, necesito eliminar el tramo después debido a algunas peculiaridades con la forma en que funciona el objeto de rango de Mozilla.

EDITAR: No quiero reemplazar todo el contenido de '#text' por cierto, ya que podría ser muy grande.

Respuesta

18

Se obtiene el texto, y reemplazar el lapso con él:

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

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

+0

Ah, expresiones regulares. Nunca he visto uno que no hiciera llorar a mi cerebro. Pero este es un buen enfoque. Simplemente reemplace el html interno con los resultados de una expresión regular. Me gusta. – Karim

+0

Lo mejor es nunca usar expresiones regulares para (X) (HT) ML ya que estos no son idiomas regulares. Sin embargo, en este caso, lo anterior debería funcionar. –

+0

-1 Esto elimina las etiquetas, pero no de la manera especificada por OP. – Imagist

3

Esto funciona:

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

Motivo del vencimiento? Probé esto en Google AJAX Playground para jQuery y funcionó ... –

+0

+1 - de hecho funciona - haga clic en la pestaña de salida - http://jsbin.com/iqola/edit –

3

esto va a hacer lo que quiere, y también conservar las etiquetas en el lapso DESTACAR .

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

sería mucho más fácil simplemente cambiar la clase del tramo que quitarlo realmente. Se puede usar puro javascript: función toggleClass

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

O de jQuery:

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

También, las mejores prácticas dicen que no se debe utilizar nombres de clase que impliquen un estilo, como punto culminante. Intenta "enfatizar" en su lugar. : D

+0

Sí, por desgracia, el lapso tiene que ser eliminado debido a la rareza con el objeto de rango que mencioné. – Karim

6

envolverlo en un plugin

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

y luego usar como tal

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

Working Demo acá - /editar a la URL para jugar con el código

+0

Hablando de hacer un esfuerzo adicional ... bien. – Karim

+0

Poner cosas en un complemento es casi siempre una buena jugada (y ahora lo es) +1 –

-1

Un mejor complemento para desenvolver:

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

    return this; 
}; 

de Ben Alman

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