2009-05-05 47 views
53

tôi đang cố gắng để thu thập một danh sách (mảng) của id trong một ngànhLàm thế nào để có được tất cả các ID với jQuery?

<div id="mydiv"> 
<span id='span1'> 
<span id='span2'> 
</div> 

$("#mydiv").find("span"); 

mang lại cho tôi một đối tượng jQuery, nhưng không phải là một mảng sản;

tôi có thể làm

var array = jQuery.makeArray($("#mydiv").find("span")); 

và sau đó sử dụng một vòng lặp for để đặt thuộc tính id vào một mảng

hoặc tôi có thể làm

$("#mydiv").find("span").each(function(){}); //but i cannot really get the id and assign it to an array that is not with in the scope?(or can I) 

Nhưng dù sao, tôi chỉ muốn xem có một cách viết tắt trong jQuery để làm điều đó;

Trả lời

121

// nhưng tôi có thể không thực sự có được id và gán nó vào một mảng đó không phải là với trong phạm vi? (Hoặc có thể tôi)

Có, bạn có thể!

var IDs = []; 
$("#mydiv").find("span").each(function(){ IDs.push(this.id); }); 

Đây là vẻ đẹp của closures.

Lưu ý rằng khi bạn đang đi đúng hướng, sighohwellcletus cả chỉ ra cách đáng tin cậy hơn và súc tích đạt được điều này, lợi dụng attribute filters (để hạn chế các yếu tố phù hợp với những người có ID) và jQuery tích hợp trong map() chức năng :

var IDs = $("#mydiv span[id]")   // find spans with ID attribute 
    .map(function() { return this.id; }) // convert to set of IDs 
    .get(); // convert to instance of Array (optional) 
+0

yeah, tôi didnt sử dụng một mảng thực bởi vì về mặt kỹ thuật bạn * có thể * đưa ID trùng lặp trong html mặc dù nó hoàn toàn sai lầm khi làm điều đó –

+0

@Deviant: true (mặc dù nếu bạn làm điều đó, bạn đã tạo ID không có ích ...) Một lý do khác ví dụ của tôi không phù hợp với mã sản xuất đơn giản là nó không lọc các phần tử - nếu Roy có bất kỳ nhịp nào không có ID, anh ta ' sẽ kết thúc với các phần tử rỗng trong mảng. – Shog9

+0

Tôi sử dụng chức năng này để chỉ nhận được các biến duy nhất (id trùng lặp của ốc vít, chúng sẽ không hoạt động ở lần xuất hiện thứ hai) '$ .unique ($ ('[id]'). Map (function() {return this. id;}). get()); 'Bằng cách gói nó trong $ .unique nó được lọc độc đáo giữ mã của bạn sạch sẽ :-) – Tschallacka

3

Không phải là bất động mảng, nhưng obj là tất cả các mảng liên kết trong javascript.

Tôi chọn không sử dụng một mảng thực với [] và [] .push vì về mặt kỹ thuật, bạn có thể có nhiều ID trên một trang mặc dù điều đó không chính xác. Vì vậy, chỉ là một lựa chọn trong trường hợp một số html đã nhân đôi ID của

$(function() { 

     var oArr = {}; 
     $("*[id]").each(function() { 
      var id = $(this).attr('id'); 
      if (!oArr[id]) oArr[id] = true; 
     }); 

     for (var prop in oArr) 
      alert(prop); 

    }); 
7

cách tốt nhất tôi có thể nghĩ ra để trả lời này là làm cho một plugin tùy chỉnh jquery để làm điều này:

jQuery.fn.getIdArray = function() { 
    var ret = []; 
    $('[id]', this).each(function() { 
    ret.push(this.id); 
    }); 
    return ret; 
}; 

Sau đó làm một cái gì đó giống như

var array = $("#mydiv").getIdArray(); 
30

Phương thức .get() sẽ trả về một mảng từ đối tượng jQuery. Ngoài ra, bạn có thể sử dụng .map để chiếu trước thứ gọi trước()

var idarray = $("#myDiv") 
      .find("span") //Find the spans 
      .map(function() { return this.id; }) //Project Ids 
      .get(); //ToArray 
11

Đề xuất của tôi?

var arr = $.map($("#mydiv [id]"), function(n, i) { 
    return n.id; 
}); 

bạn cũng có thể làm được điều này như:

var arr = $.map($("#mydiv span"), function(n, i) { 

hoặc

var arr = $.map($("#mydiv span[id]"), function(n, i) { 

hoặc thậm chí chỉ:

var arr = $("#mydiv [id]").map(function() { 
    return this.id; 
}); 

Rất nhiều cách khác nhau về cơ bản.

5

Đó là câu trả lời trễ nhưng giờ đây có một cách dễ dàng. Phiên bản hiện tại của jquery cho phép bạn tìm kiếm nếu thuộc tính tồn tại. Ví dụ:

$('[id]') 

sẽ cung cấp cho bạn tất cả các yếu tố nếu chúng có id. Nếu bạn muốn tất cả nhịp với id bắt đầu với span bạn có thể sử dụng

$('span[id^="span"]') 
-1
for(i=1;i<13;i++)  
{ 

    alert($("#tdt"+i).val()); 

} 
1

Bạn có thể lấy id của thẻ specifict và gửi nó đến một yếu tố annother. Ví dụ:

$("input").map(function() { 
    $("textarea").append(this.id+"\n"); 
}); 

Nó sẽ nhận tất cả các id đầu vào và gửi đến văn bản.

1

HTML

<div id="mydiv"> 
<span id='span1'> 
<span id='span2'> 
</div> 

JQuery

var IDs = []; 
$("#mydiv").find("span").each(function(){ IDs.push($(this).attr("id")); }); 
+0

Thử thêm một chút văn bản giải thích vào câu trả lời của bạn. – Mike

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