2013-05-26 2 views
0

Есть ли более эффективный способ сделать следующее?Более эффективный способ сделать несколько родителей

$(this).parent().parent().parent().parent().parent().addClass('finished'); 

Обратите внимание, что мне нужно parent концепцию, потому что у меня есть несколько похожих элементов на странице.

+4

'родители ('anyCssSelector')' – Sourabh

+4

Также [ '.closest (селектор)'] (http://api.jquery.com/closest/#closest1) –

+0

есть ли что-то более эффективное зависит от * почему * вам нужно было использовать это в первую очередь ... Что такое 'this', и как выглядит ваш DOM? – Bergi

ответ

3

Если цель состоит в том, чтобы получить Nth родителя, вы можете смешать .parents(selector) с :eq() selector, отметив, что :eq(0) получает 1-й пункт:

$(this).parents(':eq(4)').addClass('finished'); 
+0

Ну, это короче, но он менее эффективен, поскольку он ищет всех родителей? – Bergi

2

Если у вас есть какой-либо способ, чтобы получить элемент с селектором CSS, вы можете сделать это:

$(this).parents('selector'); 

.parents()

+0

Здесь должно быть' parent' не 'parent'. – David542

+0

jQuery API:' .parents() и .parent() аналогичны, за исключением того, что последний перемещается только на один уровень вверх по дереву DOM. ' – Sourabh

+0

Не пойдет правильно, если селектор соответствует нескольким предкам, но это обычно маловероятно. – Barmar

3

Если это то, что вы используете много, и добавление собственных селекторы не вариант, вы можете просто создать свой собственный метод, чтобы получить то, что вы хотите, а также:

$.fn.parent_num = function(num) { 
    var elem = []; 
    this.each(function() { 
     var el = this; 
     while(num>0) { 
      if (el.parentNode) el = el.parentNode; 
      num--; 
     } 
     elem.push(el); 
    }); 
    return $(elem || this); 
}; 

использоваться как:

$(this).parent_num(5).addClass('finished'); 

FIDDLE

Смежные вопросы