2008-10-29 13 views

Respuesta

132
var optionTexts = []; 
$("ul li").each(function() { optionTexts.push($(this).text()) }); 

... debe hacer el truco. Para obtener el resultado final que se le busca, además de algunos join() concatenación va a hacer muy bien:

var quotedCSV = '"' + optionTexts.join('", "') + '"'; 
+2

¿jQuery garantiza un orden a los elementos devueltos por la consulta? Supongo que la orden devuelta es la misma que en el DOM (es decir, texto1, texto2, texto3), pero no sé qué buscar en la documentación para ver si esto es cierto. – styfle

+2

Nunca lo he visto atravesar el DOM de ninguna otra forma que el orden normal de lectura. Entonces, aunque no puedo probarlo, apostaría a la granja que siempre cruza el DOM de arriba a abajo :) – Flater

+0

¿No se considera que $ .each tiene un mal rendimiento? Si es así, ¿hay alguna otra forma de hacerlo? – Daniel

6
var arr = new Array(); 

$('li').each(function() { 
    arr.push(this.innerHTML); 
}) 
+1

En lugar de confiar en innerHTML, debe cambiar "this" a un objeto jQuery y usar el método de texto nativo jQuery. $ (this) .text() –

+3

¿por qué? eventualmente $ (this) .html() usará el método nativo – Khodor

+0

En este caso, es mejor usar [] en lugar de la nueva matriz() - [Cuál es la diferencia] (http://stackoverflow.com/a/1273936/3183606) – krypru

13

Y en javascript limpia:

var texts = [], lis = document.getElementsByTagName("li"); 
for(var i=0, im=lis.length; im>i; i++) 
    texts.push(lis[i].firstChild.nodeValue); 

alert(texts); 
+0

trabajado para la conversión de js a coffee :) – cegprakash

67

Sin matrices redundantes intermedios:

arr = $('li').map(function(i, el) { 
    return $(el).text(); 
}).get(); 

Ver jsfiddle demo

+6

Te pierdes '.get()' al final. –

+4

Basado en la sugerencia de Felix Klings: arr = $ ('li').map (function() { return $ (this) .text(); }). get(); –

+0

Thx, fixed..get() added – kimstik

14

kimstik estaba cerca, pero no del todo.

Así es como hacerlo en un cómodo de una sola línea:

$.map($('li'), function (element) { return $(element).text() }); 

Aquí está la documentación completa para la función de mapa de jQuery, que es bastante práctico: http://api.jquery.com/jQuery.map/

Sólo para responder plenamente, aquí está la funcionalidad completa estabas buscando:

$.map($('li'), function (element) { return $(element).text() }).join(', '); 
+0

Acabo de ver esto aquí (http://stackoverflow.com/questions/4856283/jquery-collect-value-of-list-items-and-place-in-array) y iba a volver a publicar ya que es un gran truco para saber – SeanDowney

+0

Mi camino debe ser un poco más rápido ... ¿o no? – kimstik

+0

kimstik, de acuerdo con Benchmark.js, mi llamada de función hace 11,252/9,685 ops/sec para Opera y Chrome, respectivamente, mientras que la llamada al método que publicas hace 9,666/9,083 ops/sec en una lista de 40 elementos. Creo que la diferencia proviene de la conversión de la lista de elementos jQuery a Array en su ejemplo, si eso ayuda. Son muy cercanos, así que elige el que mejor se adapte a tu estilo de codificación :) – Cybolic

Cuestiones relacionadas