Me gustaría obtener todos los nodos de texto descendientes de un elemento, como una colección jQuery. ¿Cuál es la mejor manera de hacer eso?
fuente
Me gustaría obtener todos los nodos de texto descendientes de un elemento, como una colección jQuery. ¿Cuál es la mejor manera de hacer eso?
jQuery no tiene una función conveniente para esto. Debe combinar contents()
, lo que dará solo nodos secundarios pero incluye nodos de texto, con find()
, que da todos los elementos descendientes pero no nodos de texto. Esto es lo que se me ocurrió:
var getTextNodesIn = function(el) {
return $(el).find(":not(iframe)").addBack().contents().filter(function() {
return this.nodeType == 3;
});
};
getTextNodesIn(el);
Nota: Si está utilizando jQuery 1.7 o anterior, el código anterior no funcionará. Para solucionar esto, reemplace addBack()
con andSelf()
. andSelf()
está en desuso a favor de addBack()
1.8 en adelante.
Esto es algo ineficiente en comparación con los métodos DOM puros y tiene que incluir una solución fea para la sobrecarga de jQuery de su contents()
función (gracias a @rabidsnail en los comentarios por señalar eso), así que aquí hay una solución que no es jQuery que utiliza una función recursiva simple. El includeWhitespaceNodes
parámetro controla si los nodos de texto de espacios en blanco se incluyen o no en la salida (en jQuery se filtran automáticamente).
Actualización: error corregido cuando includeWhitespaceNodes es falso.
function getTextNodesIn(node, includeWhitespaceNodes) {
var textNodes = [], nonWhitespaceMatcher = /\S/;
function getTextNodes(node) {
if (node.nodeType == 3) {
if (includeWhitespaceNodes || nonWhitespaceMatcher.test(node.nodeValue)) {
textNodes.push(node);
}
} else {
for (var i = 0, len = node.childNodes.length; i < len; ++i) {
getTextNodes(node.childNodes[i]);
}
}
}
getTextNodes(node);
return textNodes;
}
getTextNodesIn(el);
document.getElementById()
primero, si eso es lo que quieres decir:var div = document.getElementById("foo"); var textNodes = getTextNodesIn(div);
.contents()
todos modos implica que también buscará en el iframe. No veo cómo podría ser un error.Jauco publicó una buena solución en un comentario, así que la estoy copiando aquí:
fuente
fuente
jQuery.contents()
se puede usar conjQuery.filter
para encontrar todos los nodos de texto secundarios. Con un pequeño giro, también puede encontrar nodos de texto de nietos. No se requiere recursividad:jsFiddle
fuente
Estaba obteniendo muchos nodos de texto vacíos con la función de filtro aceptada. Si solo está interesado en seleccionar nodos de texto que contengan espacios en blanco, intente agregar un
nodeValue
condicional a sufilter
función, como un simple$.trim(this.nodevalue) !== ''
:http://jsfiddle.net/ptp6m97v/
O para evitar situaciones extrañas en las que el contenido se ve como un espacio en blanco, pero no lo es (por ejemplo, el
­
carácter de guión suave , líneas nuevas\n
, pestañas, etc.), puede intentar usar una Expresión regular. Por ejemplo,\S
coincidirá con los caracteres que no sean espacios en blanco:fuente
Si puede suponer que todos los elementos secundarios son Nodos de elemento o Nodos de texto, entonces esta es una solución.
Para obtener todos los nodos de texto secundarios como una colección jquery:
Para obtener una copia del elemento original con hijos sin texto eliminados:
fuente
Por alguna razón
contents()
no funcionó para mí, así que si no funcionó para usted, aquí hay una solución que hice, creéjQuery.fn.descendants
con la opción de incluir nodos de texto o noUso
Obtenga todos los descendientes, incluidos los nodos de texto y los nodos de elementos
Obtener todos los descendientes que solo devuelven nodos de texto
Obtener todos los descendientes que devuelven solo nodos de elementos
Coffeescript Original :
Drop In Versión Javascript
Este es un navegador cruzado,
Array.indexOf
se incluye un pequeño polyfill en el código.fuente
También se puede hacer así:
El código anterior filtra los textNodes de los nodos secundarios hijos directos de un elemento dado.
fuente
si desea quitar todas las etiquetas, intente esto
función:
uso:
fuente
Para mí, simplemente viejo
.contents()
parece funcionar para devolver los nodos de texto, solo tiene que tener cuidado con sus selectores para que sepa que serán nodos de texto.Por ejemplo, esto envolvió todo el contenido de texto de los TD en mi tabla con
pre
etiquetas y no tuvo problemas.fuente
Tuve el mismo problema y lo resolví con:
Código:
Uso:
Es como
next()
pero también devuelve los nodos de texto.fuente