2012-07-24 9 views
15

Imagínese que tengo algo como lo siguiente (modificado de http://viralpatel.net/blogs/jquery-get-text-element-without-child-element/)¿Cómo eliminar texto (sin quitar elementos internos) de un elemento padre usando jQuery

<div id="foo"> 
    first 
    <div id="bar1"> 
     jumps over a lazy dog! 
    </div> 
    second 
    <div id="bar2"> 
     another jumps over a lazy dog! 
    </div> 
    third 
</div> 

¿Cómo puedo eliminar sólo (sólo texto) "primera "," segundo "y" tercero "de DOM sin afectar a ninguno de los elementos secundarios.

+0

http://stackoverflow.com/questions/2715167/jquery-how-to-remove-the-text-but-not-the-children -elementos o http://stackoverflow.com/questions/3442394/jquery-using-text-to-retrieve-only-text-not-nested-in-child-tags – kannix

+0

se responde aquí http: // stackoverflow.com/questions/6388507/use-jquery-to-select-text-not-in-an-element – fan711

+0

Las respuestas en todas las preguntas vinculadas, todas están completamente equivocadas, causan problemas no deseados, como controladores de eventos perdidos o interrupciones en ciertos navegadores (p. uso de las constantes 'nodeType'). –

Respuesta

26

Si desea eliminar todos los nodos de texto niño que puede utilizar .contents() y luego .filter() para reducir el conjunto combinado de sólo los nodos de texto:

$("#foo").contents().filter(function() { 
    return this.nodeType === 3; 
}).remove();​​​​​​​ 

Aquí hay un working example.

Nota: Esto conservará cualquier controlador de eventos existentes en los elementos secundarios, que responde utilizando .html() no va a hacer (ya que los elementos se eliminan de la DOM y añaden de nuevo).

Nota 2: Respuestas en algunas de las cuestiones vinculadas muestran un código similar al que en mi respuesta aquí, sino que utilizan los nodeType constantes (por ejemplo return this.nodeType === Node.TEXT_NODE). Esta es una mala práctica ya que IE debajo de la versión 9 no implementa la propiedad Node. Es más seguro usar los enteros (que se pueden encontrar en el DOM level 2 spec).

+0

Las terribles soluciones '.html' no eliminan manejadores en este caso (¿o tal vez sí?), Pero eso es solo por accidente porque' .html' también puede insertar nodos (no documentados). Editar: Ok, definitivamente eliminan manejadores debido al '.empty()' implícito en '.html' – Esailija

+0

@Esailija - Al usar el código de la respuesta de mgraph, parece que se elimina el manejador de eventos: http://jsfiddle.net/jamesallardice/ PXxC4/1/ –

+1

Sí, tienes razón, pedos de cerebro estúpidos: P – Esailija

2

Puede usar esto.

$("#foo").html($("#foo").children());​ 
+0

Este es el único que funcionó para mí. – zorrotmm

9

Aquí es una versión no jQuery que funciona en todos los navegadores de nuevo a IE 5, sólo para demostrar cómo unscary vida sin jQuery es.

Demostración: http://jsfiddle.net/timdown/aHW9J/

Código:

var el = document.getElementById("foo"), child = el.firstChild, nextChild; 

while (child) { 
    nextChild = child.nextSibling; 
    if (child.nodeType == 3) { 
     el.removeChild(child); 
    } 
    child = nextChild; 
} 
+0

bueno, eso me acaba de asustar;) –

+0

@JamieHutber: No te preocupes, todo estará bien. –

+0

perr perrrr perr –

Cuestiones relacionadas