2013-05-26 4 views
0

Existe-t-il un moyen plus efficace de faire ce qui suit?Manière plus efficace de faire plusieurs parents

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

Notez que je dois le concept parent, parce que j'ai plusieurs objets similaires sur la page.

+4

'les parents ('anyCssSelector')' – Sourabh

+4

aussi [ '.closest (sélecteur)'] (http://api.jquery.com/closest/#closest1) –

+0

Qu'il y ait quelque chose de plus efficace dépend de * pourquoi * vous avez besoin de l'utiliser en premier lieu ... Qu'est-ce que 'this', et à quoi ressemble votre DOM? – Bergi

Répondre

3

Si le but est d'obtenir le parent Nième, vous pouvez mélanger .parents(selector) avec le :eq() selector, notant que :eq(0) obtient le 1er article:

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

Eh bien, c'est plus court, mais c'est moins efficace car il cherche tous les parents? – Bergi

2

Si vous avez un moyen d'obtenir l'élément avec un sélecteur CSS, vous pouvez le faire:

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

.parents()

+0

Il doit être' 'parents' pas parent' ici – David542

+0

jQuery API:' Les .parents..() et les méthodes .parent() sont similaires, sauf que celui-ci ne se déplace un seul niveau jusqu'à l'arborescence DOM. ' – Sourabh

+0

ne le fera pas la bonne chose si le sélecteur correspond à ancêtres multiples, mais qui est généralement peu probable. – Barmar

3

Si cela est quelque chose que vous utilisez beaucoup, et en ajoutant des sélecteurs appropriés ne sont pas une option, vous pouvez simplement créer votre propre méthode pour obtenir ce que vous voulez ainsi:

$.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); 
}; 

à être utilisé comme:

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

FIDDLE

Questions connexes