Si tengo html como este:
<li id="listItem">
This is some text
<span id="firstSpan">First span text</span>
<span id="secondSpan">Second span text</span>
</li>
Estoy tratando de usar .text()
para recuperar solo la cadena "Esto es algo de texto", pero si tuviera que decir $('#list-item').text()
, obtengo "Esto es algo de textoPrimero texto de extensiónSegundo texto de extensión".
¿Hay alguna manera de obtener (y posiblemente eliminar, a través de algo como .text("")
) solo el texto libre dentro de una etiqueta, y no el texto dentro de sus etiquetas secundarias?
El HTML no fue escrito por mí, así que esto es con lo que tengo que trabajar. Sé que sería simple simplemente envolver el texto en etiquetas al escribir el html, pero nuevamente, el html está preescrito.
Respuestas:
Me gustó esta implementación reutilizable basada en el
clone()
método que se encuentra aquí para obtener solo el texto dentro del elemento padre.Código provisto para una fácil referencia:
fuente
Respuesta simple:
fuente
this.nodeType == Node.TEXT_NODE
lugar dethis.nodeType == 3
. Más fácil de leer y entender IMO..contents().filter(...)
llamada en una variable local y verifique su longitud, por ejemplo,var text = $(this).contents().filter(...); if (text.length) { return text[0].nodeValue; } return "";
Esto parece un caso de uso excesivo de jquery para mí. Lo siguiente tomará el texto ignorando los otros nodos:
Tendrá que recortar eso, pero obtendrá lo que desea en una sola línea fácil.
EDITAR
Lo anterior obtendrá el nodo de texto . Para obtener el texto real, use esto:
fuente
$('.foo')[0].childNodes[0].nodeValue.trim()
document
. Vine aquí usandocheerio
.Más fácil y rápido:
fuente
get(0)
lugar de solo[0]
?Similar a la respuesta aceptada, pero sin clonación:
Y aquí hay un complemento jQuery para este propósito:
Aquí se explica cómo usar este complemento:
fuente
.contents()
parte es crítica aquí!no es el código:
solo convirtiéndome en jQuery por el bien de jQuery? Cuando las operaciones simples implican tantos comandos encadenados y tanto procesamiento (innecesario), tal vez sea hora de escribir una extensión jQuery:
llamar:
los argumentos son en caso de que se encuentre un escenario diferente, como
el texto tendrá valor:
fuente
Prueba esto:
fuente
Tendrá que ser algo adaptado a las necesidades, que dependen de la estructura que se le presente. Para el ejemplo que ha proporcionado, esto funciona:
Demostración: http://jquery.nodnod.net/cases/2385/run
Pero depende bastante de que el marcado sea similar a lo que publicaste.
fuente
clone
método aquí si ese no es el efecto deseado..detach()
método en lugar de.remove()
.Variante corta de la respuesta de Stuart.
o con
get()
fuente
fuente
Esta es una vieja pregunta, pero la respuesta principal es muy ineficiente. Aquí hay una mejor solución:
Y solo haz esto:
fuente
Supongo que esta sería una buena solución también, si desea obtener el contenido de todos los nodos de texto que son hijos directos del elemento seleccionado.
Nota: la documentación de jQuery utiliza un código similar para explicar la función de contenido: https://api.jquery.com/contents/
PD: También hay una forma un poco más fea de hacerlo, pero esto muestra más en profundidad cómo funcionan las cosas y permite un separador personalizado entre los nodos de texto (tal vez desee un salto de línea allí)
fuente
Propongo usar createTreeWalker para encontrar todos los elementos de texto que no están adjuntos a elementos html (esta función se puede usar para extender jQuery):
fuente
Si la posición
index
del nodo de texto está fija entre sus hermanos, puede usarfuente
No estoy seguro de cuán flexible o cuántos casos necesita para cubrir, pero para su ejemplo, si el texto siempre viene antes de las primeras etiquetas HTML, ¿por qué no simplemente dividir el html interno en la primera etiqueta y tomar la primera:
y si lo necesitas más ancho tal vez solo
y si necesita el texto entre dos marcadores, como después de una cosa pero antes de otra, puede hacer algo como (no probado) y usar declaraciones if para que sea lo suficientemente flexible como para tener un marcador de inicio o fin o ambos, evitando al mismo tiempo los errores de referencia nula :
Generalmente hago funciones de utilidad para cosas útiles como esta, las hago libres de errores y luego confío en ellas con frecuencia una vez que son sólidas, en lugar de reescribir siempre este tipo de manipulación de cadenas y arriesgar referencias nulas, etc. De esa manera, puede reutilizar la función en muchos proyectos y nunca más tendrá que perder el tiempo depurando por qué una referencia de cadena tiene un error de referencia indefinido. Puede que no sea el código de 1 línea más corto de la historia, pero después de tener la función de utilidad, es una línea a partir de ese momento. Tenga en cuenta que la mayor parte del código solo maneja los parámetros que existen o no para evitar errores :)
Por ejemplo:
fuente
$('#listItem').html( newHTML )
; donde newHTML es una variable que ya tiene el texto despojado.Esta es una buena manera para mi
fuente
Se me ocurrió una solución específica que debería ser mucho más eficiente que la clonación y modificación del clon. Esta solución solo funciona con las siguientes dos reservas, pero debería ser más eficiente que la solución actualmente aceptada:
Dicho esto, aquí está el código:
fuente
Al igual que la pregunta, yo estaba tratando de extraer texto con el fin de hacer alguna sustitución de expresiones regulares del texto, pero estaba recibiendo problemas donde mis elementos internos (es decir:
<i>
,<div>
,<span>
, etc.) también se iban a quitar.El siguiente código parece funcionar bien y resolvió todos mis problemas.
Utiliza algunas de las respuestas proporcionadas aquí, pero en particular, solo sustituirá el texto cuando el elemento sea de
nodeType === 3
.Lo que hace lo anterior es recorrer todos los elementos de lo dado
el
(que simplemente se obtuvo con$("div.my-class[name='some-name']");
. Para cada elemento interno, básicamente los ignora. Para cada porción de texto (según lo determinado porif (this.nodeType === 3)
) aplicará la sustitución de expresiones regulares solo a esos elementos .La
this.textContent = text
porción simplemente reemplaza la indicación sustitutiva, que en mi caso, yo estaba buscando para los tokens como[[min.val]]
,[[max.val]]
, etc.Este breve extracto de código ayudará a cualquiera que intente hacer lo que la pregunta estaba haciendo ... y un poco más.
fuente
solo ponlo en un
<p>
o<font>
y agarrar ese texto $ ( '# listitem fuente'). ()Lo primero que me vino a la mente
fuente
Puedes probar esto
fuente
Use una condición adicional para verificar si innerHTML e innerText son iguales. Solo en esos casos, reemplace el texto.
http://jsfiddle.net/7RSGh/
fuente
Para poder recortar el resultado, use DotNetWala así:
Descubrí que usar la versión más corta como
document.getElementById("listItem").childNodes[0]
no funcionará con trim () de jQuery.fuente
document.getElementById("listItem").childNodes[0]
es javascript simple, tendrías que envolverlo en la función jQuery$(document.getElementById("listItem").childNodes[0]).trim()
.trim()
al final. ¿Es necesaria esta respuesta?No soy un experto en jquery, pero ¿qué tal,
fuente
Esto no ha sido probado, pero creo que puede intentar algo como esto:
http://api.jquery.com/not/
fuente
$('#listItem').text()
.#listItem
no es una<span>
suma, asínot('span')
que no hace nada.