Получить все одинаковые элементы после определенного элемента, даже если он глубоко вложен - PullRequest
1 голос
/ 14 декабря 2011

Я хочу получить все флажки после определенного элемента. Это флажки в разных div и таблицах. Я попробовал:

$('.available').click(function() {
 $(this).nextAll("input:checkbox").each(function()
 {
   //code
 });
});

Спасибо

Ответы [ 3 ]

6 голосов
/ 14 декабря 2011

Вы должны подняться на DOM ( тестовый случай ):

$(this)                                         
    .parents().andSelf()                         // get all parents of this as well
    .nextAll().find('input:checkbox').andSelf()  // get all siblings after and find any
    .filter('input:checkbox');                   // if real next sibling wasn't, kill it

Имейте в виду, что это довольно тяжелая производительность .Вы:

  1. Поднимитесь по DOM (довольно быстро)
  2. Для каждого родителя получите всех следующих братьев и сестер (полусвободных)
  3. Затем ищите вниз по каждомудля флажков, повторяя один и тот же поиск несколько раз на дочерних узлах
  4. Наконец, отфильтровывая все оставшиеся не-флажки (нужно еще раз просмотреть найденный набор)

Это jQuery волшебство, но определенно есть лучший выход за пределы простоты jQuery.Это может быть O (n ^ n) сложность - худший вид.

0 голосов
/ 14 декабря 2011

nextAll получит только братьев и сестер, так что ...

сначала давайте установим все флажки:

var checkboxes = $("input:checkbox");

Далее, подготовьте массив для хранения только тех, которые мы хотим:

var checkboxesslice = [];    

Теперь давайте пройдемся по ним, чтобы найти нашу отправную точку:

var startedyet = false;
for( var i=0; i<checkboxes.length; i+=1){
    if(startedyet){
        checkboxesslice.push(checkboxes[i]);
    }
    if(checkboxes[i] === $(this) ){
         startedyet = true;
    }     
}

Это полностью не проверено, но вы поймете идею.

0 голосов
/ 14 декабря 2011

Я не знаю, является ли ваш конкретный элемент флажком, но в противном случае вам придется начинать с набора, который содержит все флажки и ваш элемент:

var selector = ':checkbox, #target';

Затем вы можете узнать индекс вашего элемента в этом наборе, используя index():

var targetIx = $('#target').index(selector);

И после этого индекса вы также сможете сократить свой набор до всего:

var elementsAfter = $(selector).slice(targetIx+1);
...