2012-03-22 33 views
8

Tôi muốn để lặp qua tất cả Childs của giá trị trả về của một jQuery .children(), như thế này:Làm thế nào để lặp qua trẻ em bị cho vòng

var childs = $element.children();   
for (var i = 1; i < childs.length - 1; i++) 
    childs__.foo(); 

Tôi phải làm gì để viết trong 3 dòng thay vì __, để tiếp cận đứa trẻ thứ i?

Tôi muốn điều này becaus Tôi muốn truy cập (i-1) -thứ và (i + 1) con -thứ trong vòng lặp, như thế này:

var childs = $element.children();   
for (var i = 1; i < childs.length - 1; i++) 
{ 
    childs<<i>>.css('height', childs<<i - 1>>.height()); 
    childs<<i>>.css('width', childs<<i + 1>>.width()); 
} 

Vì vậy, tôi giả định each() chức năng sẽ không làm việc.

Trả lời

14

childsjavascript array. Vì vậy, bạn truy cập các đối tượng trong mảng bằng childs[indexOfElement]. Trong trường hợp của bạn childs[i].

var childs = $element.children();   
for (var i = 1; i < childs.length - 1; i++) 
    childs[i].foo(); 

var childs = $element.children();   
for (var i = 1; i < childs.length - 1; i++) 
{ 
    childs[i].css('height', childs[i-1].height()); 
    childs[i].css('width', childs[i+1].width()); 
} 

NHƯNG: Mã của bạn có lỗi. Phần tử từ bộ sưu tập trẻ em KHÔNG phải là một đối tượng jQuery. Nó chỉ là một phần tử DOM. Vì vậy, bạn phải bọc chúng trong $(...) để sử dụng các hàm jQuery. Vì vậy, mã của bạn sẽ trở thành:

var childs = $element.children();   
for (var i = 1; i < childs.length - 1; i++) 
{ 
    var thisElement = $(childs[i]); 
    var next = $(childs[i+1]); 
    var prev = $(childs[i-1]); 
    thisElement.css('height', prev.height()); 
    thisElement.css('width', next.width()); 
} 

PS. Nó phải được đặt tên là children. :)

+3

bạn nên làm rõ rằng OP sẽ truy cập vào nút DOM tinh khiết trong trường hợp này, không có đối tượng jQuery. – jAndy

+0

@jAndy Yep, chỉ nhận ra rằng bản thân mình, sau khi đọc lại và cập nhật câu trả lời. Cảm ơn! – Strelok

+0

Nói đúng ra, một đối tượng jQuery không phải là một mảng, nó là * giống như mảng *. –

2

Bạn có thể sử dụng hàm each() và sử dụng "this" để lấy đối tượng hiện tại. Sau đó, bạn có thể sử dụng các hàm next() và prev() thay cho i + 1 và i-1 tương ứng. Tôi đã không kiểm tra mã để nó có thể hoặc có thể không hoạt động; hy vọng chỉ trong đúng hướng :)

jQuery.each($element.children(), function() { 
{ 
    $(this).css('height', $(this).prev().height()); 
    $(this).css('width', $(this).next().width()); 
} 
+2

Nó được gọi là '.prev'. – pimvdb

+0

Rất tiếc. – turpachull

1

Chức năng each() sẽ làm việc, hãy xem này:

$('#something').children().each(function(index) { 

    $(this).css('width', (parseInt($(this).css('width').replace('px', '')) + index) + "px"); 

    // to access the previous and next element: 
    $(this).prev().css('width', '100px'); 
    $(this).next().css('width', '200px'); 

}); 

Điều đó sẽ thay đổi chiều rộng, thêm các chỉ số như một điểm ảnh trên mỗi lần lặp - chỉ để giới thiệu cách lấy chỉ mục.

+0

của tôi xấu vì vậy làm thế nào để tôi truy cập (i-1) -th và (i + 1) -th child trong vòng lặp? – user1027167

+0

Tôi đã cập nhật câu trả lời cho thấy rằng sử dụng .prev() và .next() – MrCode

1

Sử dụng .eq() để nhận được chỉ số tại chỉ mục được chỉ định của các phần tử dom phù hợp được đặt.

var childs = $element.children();   
for (var i = 1; i < childs.length - 1; i++) 
{ 
    childs.eq(i).css('height', childs.eq(i - 1).height()); 
    childs.eq(i).css('width', childs.eq(i + 1).width()); 
} 

và cách tiếp cận khác đơn giản là để đạt được điều này mà không cần sử dụng vòng lặp .each()

jQuery.each($element.children(), function() { 
{ 
    $(this).css('height', this.prev().height()); 
    $(this).css('width', this.next().width()); 
} 
+0

"Nó được gọi là .prev." như pimvdb đã đề cập :), nhưng +1 cho eq – user1027167

+0

và 'this' không phải là đối tượng jQuery để' .css() 'không tồn tại.nó phải là '$ (this) .css()'. – MrCode

+0

ohh .. bỏ lỡ bao quanh nó với bộ chọn jquery .. –

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