2012-03-22 32 views
8

Đây là fiddle tôi: http://jsfiddle.net/jamesbrighton/wxWgG/4/jQuery chọn yếu tố đầu tiên mà có một lớp nhất định sau này

HTML:

<div> 
    <p class="click">Click 1</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 1</p> 
</div> 
<div> 
    <p class="target">Target 2</p> 
</div> 


<div> 
    <p class="click">Click 2</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 3</p> 
</div> 
<div> 
    <p class="target">Target 4</p> 
</div> 

jQuery:

$('.click').click(function() { 
    $(this).nextAll('.target').css('color','red'); 
});​ 

tôi cần nó vì vậy khi bạn bấm a p.click, số p.target tiếp theo chuyển sang màu đỏ.

Vì vậy, nếu bạn nhấp vào 'Click 1' thì 'Target 1' chuyển sang màu đỏ. Nếu bạn nhấp vào 'Click 2' thì 'Target 3' chuyển sang màu đỏ.

Cũng như .find Tôi đã thử .closest và từ tài liệu jQuery, có vẻ như tôi thích nó sẽ hoạt động. Như bạn thấy từ HTML, .target không phải là con của .click, trong trường hợp tạo sự khác biệt.

+0

nextTất cả các tác phẩm trên các anh chị em, không phải bên ngoài cha mẹ của nó. Vì vậy, bạn cần phải cho chúng tôi biết làm thế nào bạn muốn đi qua .. nếu bạn muốn cha mẹ anh chị em con sau đó nó có thể. –

+1

Ví dụ của bạn không phải là rất tốt, nó chỉ chứa một phần tử "Click". Các liên kết "Nhấp chuột" và "Mục tiêu" được liên kết như thế nào? Cả hai đều theo thứ tự, có nghĩa là nếu nhấp vào "Lần nhấp" thứ hai, thì "Mục tiêu" thứ hai được tô sáng, v.v ...? * chỉnh sửa: * dường như bạn đã liên kết với fiddle sai. Đó là lý do tại sao bạn nên luôn luôn bao gồm mã. –

+0

Tôi không thấy 'Nhấp 1' hoặc 'Nhấp 2'. Mã của bạn có được cập nhật không? –

Trả lời

11

Đây là một cách tiếp cận khác, mặc dù tôi không biết cách thực hiện .index() trong trường hợp này. Điều này cũng giả định rằng không bao giờ có hai .click yếu tố liên tiếp (hoặc phrased cách khác nhau: Luôn luôn có ít nhất một .target yếu tố giữa hai .click phần tử):

var $elements = $('.click, .target'); 

$('.click').click(function() { 
    $elements.eq($elements.index(this) + 1).css('color','red'); 
});​ 

DEMO

này hoạt động bởi vì các yếu tố được lựa chọn trong thứ tự chúng xuất hiện trong tài liệu.

+1

Thông minh và tốt đẹp. –

0

Bạn xây dựng html không dễ dàng truy cập cho đến khi mục tiêu cụ thể. Chúng tôi có thể đạt được những gì bạn muốn nhưng kịch bản sẽ trở nên phức tạp khi bạn đi qua theo cách như vậy. Thay vào đó, thêm một div nhóm sẽ làm cho bạn kịch bản nhỏ và dễ dàng.

DEMO

HTML:

<div class="group"> <!-- added grouping wrapper --> 
<div> 
    <p class="click">Click 1</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 1</p> 
</div> 
<div> 
    <p class="target">Target 2</p> 
</div> 
</div> 
<div class="group"> 
<div> 
    <p class="click">Click 2</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 3</p> 
</div> 
<div> 
    <p class="target">Target 4</p> 
</div> 
</div> 

JS:

$('.click').click(function() { 
    $(this).closest('.group').find('.target').css('color','red'); 
}); 

.nextAll hoạt động trên các anh chị em. Trong trường hợp của bạn, nó sẽ tìm kiếm tất cả anh chị em của # click với lớp .target.

Điều bạn cần là parents -> sibling -> child.

DEMO

$('#click').click(function() { 
    $(this).parent().siblings().find('.target').css('color','red'); 
}); 
+0

Chỉ' .target' tiếp theo sẽ chuyển sang màu đỏ. Điều này làm cho tất cả '.target' chuyển sang màu đỏ – Ropstah

+0

Công trình này hoạt động, nhưng nó sẽ bị hỏng nếu tôi thêm một div khác xung quanh div mà contins p.click. Tôi nghĩ rằng tôi hiểu tại sao điều này lại xảy ra, nhưng liệu có cách nào để tìm ra nguyên tố tiếp theo với một lớp nhất định, bất kể nó lồng nhau như thế nào? – Evans

0

Bạn có thể thử này.

$('#click').click(function() { 
    var go = true; 

    var item = $(this).parent(); 

    while(go && item) { 
     var target = $('.target', item)[0]; 

     if(target != null) { 
      go = false; 
      $(target).css('color', 'red'); 
     } 

     item = $(item).next()[0]; 
    } 
});​ 
3

này sẽ chọn các yếu tố bạn cần trong mã html của bạn:

$('.click').click(function() { 
    $(this).parent("div").next('div').find('.target').css('color','red'); 
});​ 
6

Bạn đang tìm kiếm này?

$('.click').click(function() { 
    $(".target", $(this).parent().next()).css('color','red'); 
}); 

Updated Fiddle

+0

Tác phẩm này hoạt động, nhưng nó sẽ bị hỏng nếu tôi thêm một div khác xung quanh div có chứa p.click. Tôi nghĩ rằng tôi hiểu tại sao điều này lại xảy ra, nhưng liệu có cách nào để tìm ra nguyên tố tiếp theo với một lớp nhất định, bất kể nó lồng nhau như thế nào? – Evans

+2

HTML của bạn sẽ phải có một cấu trúc cố định hoặc bạn phải xác định rất rõ ràng những trường hợp bạn muốn được bảo hiểm. jQuery không thể đọc được tâm trí :) Miễn là bạn có thể định nghĩa bố cục, sẽ có một cách nhưng định nghĩa nhanh chóng nhất quán và chính xác. –

1

Dựa trên HTML cập nhật của bạn, tôi đã tạo fiddle này: http://jsfiddle.net/wxWgG/22/

... và sử dụng jQuery này

$('.click').click(function() { 
    $(this).parent().next().find('p.target').css('color','red'); 
});​ 

Là những gì bạn muốn?

+0

Điều này làm việc, nhưng nó phá vỡ nếu tôi thêm một div xung quanh div mà contins p.click. Tôi nghĩ rằng tôi hiểu tại sao điều này lại xảy ra, nhưng liệu có cách nào để tìm ra nguyên tố tiếp theo với một lớp nhất định, bất kể nó lồng nhau như thế nào? – Evans

+0

HTML của bạn trong OP phải nêu rõ HTML bạn muốn làm việc cùng! Xem câu trả lời của Felix Kling - có vẻ như nó sẽ có cấu trúc bất khả tri. Nếu không, hãy cập nhật OP và chờ một loạt các câu trả lời được cập nhật khác .... – SpaceBison

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