2008-10-29 4 views
95

J'ai une structure comme ceci:Obtenez un tableau de contenu de l'élément de liste dans jQuery

<ul> 
    <li>text1</li> 
    <li>text2</li> 
    <li>text3</li> 
</ul> 

Comment puis-je utiliser javascript ou jQuery pour obtenir le texte comme un tableau?

['text1', 'text2', 'text3'] 

Mon plan après est de rassembler en une chaîne, en utilisant probablement .join(', '), et l'obtenir dans un format comme celui-ci:

'"text1", "text2", "text3"' 

Répondre

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

... devrait faire l'affaire. Pour obtenir le résultat final que vous cherchez, join() plus quelques concaténation fera bien:

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

Est-ce que jQuery garantit une commande aux éléments retournés par la requête? Je suppose que la commande retournée est la même que la commande dans le DOM (ie text1, text2, text3), mais je ne sais pas quoi chercher dans la documentation pour voir si c'est vrai. – styfle

+2

Je ne l'ai jamais vu traverser le DOM d'une autre manière que l'ordre de lecture normal. Donc, bien que je ne puisse pas le prouver, je parierais que la ferme qui traverse toujours le DOM de haut en bas :) – Flater

+0

Est-ce que $ .each n'est pas considéré comme ayant de mauvaises performances? Si oui, y a-t-il un autre moyen de le faire? – Daniel

6
var arr = new Array(); 

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

Au lieu de s'appuyer sur innerHTML, vous devez remplacer "this" par un objet jQuery et utiliser la méthode de texte natif jQuery. $ (this) .text() –

+3

pourquoi? Finalement $ (this) .html() utilisera la méthode native – Khodor

+0

Dans ce cas, il est préférable d'utiliser [] au lieu du nouveau tableau() - [Quelle est la différence] (http://stackoverflow.com/a/1273936/3183606) – krypru

13

Et en javascript propre:

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

travaillé pour js à la conversion de café :) – cegprakash

67

Sans tableaux intermédiaires redondants:

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

Voir jsfiddle demo

+6

Vous manquez '.get()' à la fin. –

+4

Basé sur la suggestion de Felix Klings: arr = $ ('li').map (function() { return $ (this) .text(); }). get(); –

+0

Thx, fixed..get() ajouté – kimstik

14

kimstik était proche, mais pas tout à fait.

Voici comment faire dans un one-liner pratique:

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

est ici la documentation complète pour la fonction de carte de jQuery, il est très pratique: http://api.jquery.com/jQuery.map/

Juste pour répondre pleinement, voici la fonctionnalité complète que vous recherchiez:

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

Je viens de voir ça ici (http://stackoverflow.com/questions/4856283/jquery-collect-value-of-list-items-and-place-in-array) et allais republication car il est un grand truc pour savoir – SeanDowney

+0

Mon chemin devrait être un peu plus rapide .. ou pas? – kimstik

+0

kimstik, selon Benchmark.js, mon appel de fonction ne 11,252/9685 opérations/sec pour Opera et Chrome respectivement, alors que la méthode que vous appelez ne 9,666 courant/9083 ops/s sur une liste de 40 articles. Je pense que la différence provient de la conversion de la liste d'éléments jQuery en Array dans votre exemple, si cela vous aide. Ils sont très proches, alors choisissez celui qui convient le mieux à votre style de codage :) – Cybolic

Questions connexes