2012-05-14 67 views
18

Tôi có một danh sách không có thứ tự.Trong jQuery, làm cách nào để chọn các phần tử giữa các phần tử với các lớp nhất định?

<ul> 
    <li class="foo">Baz</li> 
    <li>Select Me!</li> 
    <li>Select Me!</li> 
    <li>Select Me!</li> 
    <li class="bar">Baz</li> 
    <li>Don't Select Me</li> 
    <li>Red Herring List Item</li> 
</ul> 

Làm cách nào để chọn các mục danh sách giữa các mục danh sách với các lớp foo và thanh bằng jQuery? Tôi không biết nội dung của bất kỳ mục danh sách nào. Tôi cũng không biết có bao nhiêu mục danh sách được chọn nên tôi không thể phụ thuộc vào số lượng.

+1

[ '$ ('li.bar') prevUntil (. 'li.foo') ' ] (http://api.jquery.com/prevUntil/) – Orbling

+1

Kiểm tra mã nguồn trong câu trả lời của tôi nếu nó thú vị bạn ... – gdoron

Trả lời

28
$('li.foo').nextUntil('li.bar') 

http://jsfiddle.net/zZRDB/1/

+4

tôi hoàn toàn không có ý tưởng này tồn tại – kritzikratzi

+2

Cảm ơn bạn! fyi, bạn có thể sử dụng '$ ('li.foo'). nextUntil ('li.bar'). css ('background', '# f00');' thay vì sử dụng phương thức "attr". : D – dangerChihuahua007

+0

rất rất đẹp !!! – mcgrailm

12
var $elements = $('.bar').prevUntil('.foo'); 

Hoặc cách khác:

var $elements = $('.foo').nextUntil('.bar'); 

Demo


Nếu bạn marry biết làm thế nào nó được thực hiện, 012.382.:

nextUntil: function(elem, i, until) { 
    return jQuery.dir(elem, "nextSibling", until); 
}, 
prevUntil: function(elem, i, until) { 
    return jQuery.dir(elem, "previousSibling", until); 
},​ 

dir: function(elem, dir, until) { 
    var matched = [], 
     cur = elem[dir]; 

    while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { 
     if (cur.nodeType === 1) { 
      matched.push(cur); 
     } 
     cur = cur[dir]; 
    } 
    return matched; 
},​ 
+0

+1 cho hai cách. – VisioN

+1

@VisioN. Tôi đã nghĩ về DEMO, nó đẹp, thay đổi màu sắc ... ** 2012 ** – gdoron

+0

Hoạt ảnh màu ở đâu? Tôi đã thấy tốt hơn: P – VisioN

2

Cố gắng,

$('li.bar').prevUntil('.foo') 

DEMO

2
var index1 = $('li.foo').index(), 
    index2 = $('li.bar').index()-1; 

    $('li:gt('+ index1+'):lt('+ index2+')', 'ul'); 

hoặc $('li.foo').nextUntil('li.bar');

hoặc $('li.bar').prevUntil('li.foo');

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