2011-02-10 28 views
6

Tôi có một số javascript đang tạo một li dựa trên một đối tượng được trả về từ chương trình phụ trợ sau khi tìm kiếm AJAX. Người dùng có thể tiếp tục tìm kiếm thiết bị và khi được chọn, chúng sẽ được thêm vào trang hiện tại (dưới dạng li). Mỗi khi một li mới được tạo, tôi muốn gửi id của các đối tượng đã được chọn.Tạo một mảng với jQuery của ID đối tượng để xử lý trên phụ trợ Django

Khi li được tạo, id của chúng được đặt tên là "device - ###" trong đó ### là ID của thiết bị trong cơ sở dữ liệu, vì vậy tôi cần loại bỏ phần đó ra.

Đây là javascript đó là đem lại cho tôi những vấn đề:

 var children = $('#temp_inventory').children(); 
     var count = children.length; 
     var devices = []; 
     var i = 0; 
     while (i<=count){ 
      devices[i] = children[i].id.substr(4); 
      i++; 
     }; 

tôi nhận được lỗi sau:

Uncaught TypeError: Object #<HTMLLIElement> has no method 'attr' 

Tôi cũng đã thử nó the-jQuery không cách:

devices[i] = children[i].id.substr(4); 

Và Tôi kết thúc với lỗi này:

Uncaught TypeError: Cannot read property 'id' of undefined 

Khi tôi ném vào alert(children[i].id.substr(4)); Tôi nhận được cảnh báo với số tôi đang mong đợi.

+2

Lý do phiên bản jQuery của bạn không hoạt động là vì 'trẻ em [i]' trả về * phần tử thực *, không phải phần tử được bao bọc trong đối tượng jQuery. Cách giải quyết sẽ là '$ (trẻ em [i]). Attr'. #themoreyouknow – sdleihssirhc

Trả lời

3

Tôi nghĩ bạn có thể muốn,

while (i<count){ 
    devices[i] = children[i].id.substr(4); 
    i++; 
}; 

nếu không lặp cuối cùng sẽ vượt mục cuối cùng trong mảng.

Một cách ngắn gọn hơn để làm điều này bằng $.map()

var devices = $.map($('#temp_inventory').children(), function(elem) { 
    return elem.id.substr(4); 
}); 
4

Một phần của vấn đề này có lẽ là vòng lặp của bạn sử dụng <= thay vì <. Hãy nhớ mục cuối cùng trong danh sách sử dụng chỉ mục dựa trên không là length - 1.

Để tạo Mảng ID, bạn có thể sử dụng phương thức map()(docs) thay thế.

var devices = $('#temp_inventory').children().map(function() { 
    return this.id.substr(4); 
}).get(); 

Phương pháp .map() populates một đối tượng jQuery (mà là một đối tượng Array-loại tương tự) với các giá trị bạn trở trong hàm.

Sau đó, phương thức get()(docs) cung cấp cho bạn một mảng các giá trị đó thay vì đối tượng jQuery.

Bạn cũng có thể sử dụng phương thức toArray()(docs) thực hiện tương tự.

var devices = $('#temp_inventory').children().map(function() { 
    return this.id.substr(4); 
}).toArray(); 
Các vấn đề liên quan