2008-10-29 17 views
95

Tôi có một cấu trúc như thế này:Nhận một loạt các nội dung tố danh sách trong jQuery

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

Làm thế nào để sử dụng javascript hoặc jQuery để có được những văn bản như một mảng?

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

Kế hoạch của tôi sau này là để lắp ráp nó thành một chuỗi, có lẽ sử dụng .join(', '), và làm cho nó trong một định dạng như thế này:

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

Trả lời

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

... nên làm các trick. Để có được kết quả cuối cùng bạn đang tìm kiếm, join() cộng với một số nối sẽ làm độc đáo:

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

jQuery có bảo đảm thứ tự các phần tử được truy vấn trả về không? Tôi giả định rằng thứ tự trả về giống như thứ tự trong DOM (ví dụ: text1, text2, text3), nhưng tôi không biết phải tìm gì trong tài liệu để xem điều này có đúng không. – styfle

+2

Tôi chưa bao giờ thấy nó đi qua DOM theo bất kỳ cách nào khác mà thứ tự đọc thông thường. Vì vậy, mặc dù tôi không thể chứng minh điều đó, tôi sẽ đặt cược trang trại mà nó đang đi ngang qua đỉnh DOM từ trên xuống dưới :) – Flater

+0

Không phải $ .each được coi là có hiệu suất kém? Nếu có, có cách nào khác để làm điều đó không? – Daniel

6
var arr = new Array(); 

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

Thay vì dựa vào innerHTML, bạn nên thay đổi "this" thành đối tượng jQuery và sử dụng phương thức văn bản gốc jQuery. $ (this) .text() –

+3

tại sao? cuối cùng $ (this) .html() sẽ sử dụng phương thức gốc – Khodor

+0

Trong trường hợp này, tốt hơn nên sử dụng [] thay vì Array mới() - [Sự khác biệt] (http://stackoverflow.com/a/1273936 là gì)/3183606) – krypru

13

Và trong javascript sạch:

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

làm việc cho js để chuyển đổi cà phê :) – cegprakash

67

Nếu không có mảng trung gian không cần thiết:

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

Xem jsfiddle demo

+6

Bạn bỏ lỡ '.get()' ở cuối. –

+4

Dựa trên đề xuất của Felix Klings: arr = $ ('li').map (function() { return $ (this) .text(); }). get(); –

+0

Thx, fixed..get() đã thêm – kimstik

14

kimstik đã đóng, nhưng không hoàn toàn.

Dưới đây là làm thế nào để làm điều đó một cách thuận tiện một liner:

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

Đây là tài liệu hướng dẫn đầy đủ cho chức năng bản đồ của jQuery, nó khá tiện dụng: http://api.jquery.com/jQuery.map/

Chỉ cần trả lời đầy đủ, đây là chức năng hoàn chỉnh bạn đang tìm kiếm:

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

Tôi chỉ thấy điều này ở đây (http://stackoverflow.com/questions/4856283/jquery-collect-value-of-list-items-and-place-in-array) và sẽ đăng lại vì đó là một mẹo hay để biết – SeanDowney

+0

Cách của tôi nên nhanh hơn một chút .. hay không? – kimstik

+0

kimstik, theo Benchmark.js, hàm gọi của tôi là 11,252/9,685 ops/sec cho Opera và Chrome tương ứng, trong khi phương thức gọi bạn đăng là 9,666/9,083 ops/sec trong danh sách 40 mục. Tôi nghĩ sự khác biệt xuất phát từ việc chuyển đổi từ danh sách thành phần jQuery sang Array trong ví dụ của bạn, nếu điều đó có ích. Chúng rất gần, vì vậy hãy chọn tùy chọn nào phù hợp với phong cách mã hóa của bạn tốt hơn :) – Cybolic

Các vấn đề liên quan