2011-01-12 12 views
9

Jeśli trzeba wybrać 10-tego rodzica, czy jest czystszy sposób, a następnie powtarzanie .parent() 10 razy?Czystszy sposób na zapisanie elementu element.parent(). Parent(). Parent(). Parent(). Parent()

$('#element_id').parent().parent().parent().parent().parent().parent().parent().parent().parent().parent(); 
+8

$ („# element_id”). greatgreatgreatgreatgreatgreatgreatgreatgrandparent()? –

+0

@Larry: Bardzo ładnie. W jaki sposób jQuery przeoczyło to dla swojego API? ; o) – user113716

Odpowiedz

5

Jeśli naprawdę trzeba uzyskać 10-rodzica, a nie jesteś w stanie użyć selektora się tam dostać, płynny sposób będzie prawdopodobnie coś takiego:

$('#element_id').parents().eq(9); 
15

Jeśli istnieje selektor, który reprezentuje cel jesteś po, a następnie użyć .closest() lub .parents().

$('#element_id').closest('.someClass'); 
$('#element_id').parents('.someClass:first'); 

... ale oba te elementy zwrócą pierwszy znaleziony mecz. Właściwe rozwiązanie będzie zależeć od rzeczywistego znacznika HTML.

(Zauważ, że .closest() ocenia również oryginalnego elementu, natomiast parents() zaczyna się od pierwszego przodka.)

Należy także pamiętać, że przeglądarki dokonania korekt HTML. Jeśli więc przechodzisz od środka <table>, który nie ma wartości <tbody> do elementu znajdującego się poza kodem <table>, wykonanie liczby x .parent() może dać różne wyniki w różnych przeglądarkach.

+6

To jest sposób, aby to zrobić. Parent() dziesięciokrotnie wymaga zbyt dużej znajomości struktury DOM, co może ulec zmianie. Zastosowanie klasy do węzła, którego szukasz, jest znacznie bezpieczniejsze. –

+0

Dzięki, to jest naprawdę świetne, ale nie odpowiada na pytanie takim, jakie jest. Co się stanie, jeśli ten dziesiąty rodzic nie ma klasy lub identyfikatora? –

+0

@Silver Light: Nadal będziesz używał '.parents()' z selektorem. Daj mu selektor, który mówi: "daj mi 10 mecz" *. W ten sposób: '$ ('# element_id'). Parents (': eq (9)')'. – user113716

6

Poniższy postu here używa tej realizacji:

jQuery.fn.getParent = function(num) { 
    var last = this[0]; 
    for (var i = 0; i < num; i++) { 
     if(!last) break; 
     last = last.parentNode; 
    } 
    return jQuery(last); 
}; 
// usage: 
$('#myElement').getParent(3); 

więc wykorzystanie byłoby po prostu:

$('#element_id').getParent(10); 
+1

Spowoduje to błędy, jeśli element ma mniej niż "num" przodków. – lonesomeday

+0

Powinieneś przerwać pętlę, jeśli nie ma 'parentNode' w poprzedniej iteracji. 'if (! last) break; last = last.parentNode; '(jako @lonesomeday zanotowany powyżej) – user113716

+0

@lonesomeday, Good point. Pomyślałem, że może być użyteczne dla OP lub innych. –

0

Mam używany ten kod:

var position = $("#test").parents("div").length - 10; 
$("#test").closest("div:eq(" + position + ")").append("here!!!"); 

z tym HTML :

<div> 
     <div> 
      <div> 
       <div> 
        <div> 
         <div> 
          <div> 
           <div> 
            <div> 
             <div> 
              <div> 
               <span id="test">here</span> 
              </div> 
             </div>  
            </div> 
           </div> 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 

Tak, to 11 div. więc uruchamiając kod powinien się zatrzymać na 10. div i dołączyć tutaj !!!

Jestem pewien, że ten kod może być jeszcze bardziej czysty.

Nie trzeba dodawać zajęć.

Edytuj: Użyłem 11 DIV, więc widać, że nie będzie to pierwsze, a faktycznie zatrzyma się na 10.

Powiązane problemy