2011-06-29 14 views
57
<div class="title"> 
    I am text node 
    <a class="edit">Edit</a> 
</div> 

Deseo obtener el "Soy nodo de texto", no deseo eliminar la etiqueta "Editar" y necesito una solución de navegador cruzado.¿Cómo obtener el nodo de texto de un elemento?

+0

esta pregunta es más o menos idéntica a http://stackoverflow.com/questions/3172166/getting-the-contents- of-a-element-without-its-children - vea esas respuestas para una versión JS simple de la respuesta de James – Mala

Respuesta

51
var text = $(".title").contents().filter(function() { 
    return this.nodeType == Node.TEXT_NODE; 
}).text(); 

Esto tiene la contents del elemento seleccionado, y se aplica un filtro funcionar para eso. La función de filtro devuelve solo nodos de texto (es decir, los nodos con nodeType == Node.TEXT_NODE).

+0

sí, necesitaba poner .text(); después del filtro, pero esto funcionó ... – Val

+0

@Val - lo siento, me perdí eso del código original.Actualizaré la respuesta para mostrarlo. Necesita 'text()' porque la función 'filter' devuelve los nodos, no los contenidos de los nodos. –

+0

No estoy seguro por qué, pero no tengo éxito al probar la teoría anterior. Ejecuté el siguiente 'jQuery (" * "). Cada uno (función() { console.log (this.nodeType); })' y obtuve ** 1 ** para todos los tipos de nodos. – Batandwa

6

.text() - for jquery

$('.title').clone() //clone the element 
.children() //select all the children 
.remove() //remove all the children 
.end() //again go back to selected element 
.text(); //get the text of element 
+1

Creo que el método para javascript estándar debe ser 'innerText' – reporter

+2

Esto no funciona de la manera que el OP lo quiere obtendrá el texto dentro del elemento 'a' también: http://jsfiddle.net/ekHJH/ –

+1

@James Allardice - He terminado con la solución de jquery ahora esto va a ork ................. –

39

que pueda obtener el nodeValue de la primera childNode usando

$('.title')[0].childNodes[0].nodeValue 

http://jsfiddle.net/TU4FB/

+0

Si bien eso funcionará, depende de la posición de los nodos secundarios. Si (cuando) eso cambia, se romperá. – Armstrongest

11

Si se refiere a obtener el valor del primer nodo de texto en el elemento, el código funcionará:

var oDiv = document.getElementById("MyDiv"); 
var firstText = ""; 
for (var i = 0; i < oDiv.childNodes.length; i++) { 
    var curNode = oDiv.childNodes[i]; 
    if (curNode.nodeName === "#text") { 
     firstText = curNode.nodeValue; 
     break; 
    } 
} 

se puede ver esto en acción aquí: http://jsfiddle.net/ZkjZJ/

+0

Creo que podría usar 'curNode.nodeType == 3' en lugar de' nodeName' también. – Nilloc

+0

@Nilloc probablemente, pero ¿cuál es la ganancia? –

+1

@ShadowWizard @Nilloc es la forma recomendada de usar constantes ... 'curNode.nodeType == Node.TEXT_NODE' (la comparación numérica es más rápida pero curNode.nodeType == 3 no es legible, ¿qué nodo tiene el número 3?) – mikep

3

Esto ignorar el espacio en blanco como bueno, tu nunca obtuviste el código en blanco de los nodos de texto usando el núcleo del Javascript.

var oDiv = document.getElementById("MyDiv"); 
var firstText = ""; 
for (var i = 0; i < oDiv.childNodes.length; i++) { 
    var curNode = oDiv.childNodes[i]; 
    whitespace = /^\s*$/; 
    if (curNode.nodeName === "#text" && !(whitespace.test(curNode.nodeValue))) { 
     firstText = curNode.nodeValue; 
     break; 
    } 
} 

comprobarlo en jsFiddle: - http://jsfiddle.net/webx/ZhLep/

5

Otra solución nativa JS que puede ser útil para los elementos "complejas" o anidadas es utilizar NodeIterator. Ponga NodeFilter.SHOW_TEXT como el segundo argumento ("whatToShow"), e itere solo sobre el nodo de texto children del elemento.

var root = document.getElementById('...'), 
    iter = document.createNodeIterator (root, NodeFilter.SHOW_TEXT), 
    textnode; 

while (textnode = iter.nextNode()) { 
    // do something with the text node 
} 

También puedes usar TreeWalker. La diferencia entre los dos es que NodeIterator es un iterador lineal simple, mientras que TreeWalker le permite navegar a través de hermanos y ancestros también.

1

También puede usar la prueba de nodo text() de XPath para obtener solamente los nodos de texto. Por ejemplo

var target = document.querySelector('div.title'); 
var iter = document.evaluate('text()', target, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE); 
var node; 
var want = ''; 

while (node = iter.iterateNext()) { 
    want += node.data; 
} 
3

ES6 versión que devolver el contenido primer nodo #text

const extract = (node) => { 
    const text = Array.from(node.childNodes).find(f => f.nodeName === '#text'); 
    return text ? text.textContent.trim() : ''; 
} 
Cuestiones relacionadas