En este ejemplo se utiliza .contents()
para obtener todos los niños nodos (incluidos los nodos de texto), luego usa .map()
para convertir cada nodo secundario en una cadena basada en el nodeType
. Si el nodo es un nodo de texto (es decir, texto que no está dentro del <li>
), devolvemos su nodeValue
.
Esto devuelve un conjunto de jQuery que contiene cadenas, por lo que llamamos al .get()
para obtener un objeto de matriz 'estándar' al que podemos llamar .join()
.
// our 'div' that contains your code:
var $html = $('<li id="node">I want this<ul><li>I dont want this</li></ul> </li>');
// Map the contents() into strings
$html.contents().map(function() {
// if the node is a textNode, use its nodeValue, otherwise empty string
return this.nodeType == 3 ? this.nodeValue : undefined;
// get the array, and join it together:
}).get().join('');
// "I want this " -- note the extra whitespace from after the <ul>
y hacer una llamada simple:
$.fn.directText=function(delim) {
if (!delim) delim = '';
return this.contents().map(function() { return this.nodeType == 3 ? this.nodeValue : undefined}).get().join(delim);
};
$html.directText();
// "I want this "
O una versión ligeramente más robusto para permitir el recorte de los espacios en blanco/cambiar la cadena de unión:
$.fn.directText = function(settings) {
settings = $.extend({},$.fn.directText.defaults, settings);
return this.contents().map(function() {
if (this.nodeType != 3) return undefined; // remove non-text nodes
var value = this.nodeValue;
if (settings.trim) value = $.trim(value);
if (!value.length) return undefined; // remove zero-length text nodes
return value;
}).get().join(settings.joinText);
};
$.fn.directText.defaults = {
trim: true,
joinText: ''
};
Usted también puede insertar una espacio entre tus fragmentos de texto. – Neall
Esta es una buena respuesta, solo una posible modificación que podría beneficiar a algunos: si devolviera una serie de cadenas, obtendría dos beneficios: primero evitaría las concatenaciones de cadena potencialmente costosas y, en segundo lugar, la persona que llama obtendría una elección del separador llamando a 'join'. – OlduwanSteve
@OlduwanSteve: Es cierto, aunque no creo que las concatenaciones de cadenas sean más costosas que llamar a join en navegadores modernos. De todos modos, es bastante fácil de modificar; el enfoque general es lo principal. –