2008-10-28 15 views
7

Chciałbym sprawdzić pochodzenie za pomocą dwóch obiektów jQuery. Nie mają identyfikatorów i będą dostępne tylko jako obiekty jQuery (lub węzły DOM, jeśli wybrano get()). jQuery is() działa tylko z wyrażeń, więc ten kod byłby idealny, ale nie będzie działać:Przodkowie jQuery za pomocą obiektów jQuery

var someDiv = $('#div'); 

$('a').click(function() { 
    if ($(this).parents().is(someDiv)) { 
     alert('boo'); 
    } 
} 

prostu chcesz sprawdzić, czy jeden element jest dzieckiem z drugiego i chciałbym uniknąć cofając się do DOM gruntów, jeżeli możliwy.

Odpowiedz

12

Można użyć metody index() w celu sprawdzenia, czy element istnieje na liście, czy następujące czynności będą działać?

var someDiv = $('#div'); 

$('a').click(function() { 
    if ($(this).parents().index(someDiv) >= 0) { 
     alert('boo'); 
    } 
} 

Od #index reference.

+0

Idealny Garetha, dziękuję! Wezwę do siebie, ale moja skromna ocena reputacji zabrania mi tego. – MichaelThompson

1

Wzdłuż tych linii, rodzice() ewentualnie akceptuje selektora samego:

$('a').click(function() { 
    if ($(this).parents("#div").length) { 
    alert('boo'); 
    } 
}); 
+0

.parents() akceptuje tylko najbardziej podstawowe selektory (tzn. Działają tylko selektory opisujące pojedynczy element - nie selektory opisujące ancetrię, taką jak "p strong"). –

+0

Działa to dobrze dla tego, co próbuje zrobić. –

+0

Uproszyłem trochę mój przykład, więc w rzeczywistym kodzie uzyskuję obiekt nadrzędny, używając przechowywanych odwołań jQuery zamiast selektorów ciągów. – MichaelThompson

0

Jednym ze sposobów byłoby użyć funkcji filtrowania

$('a').click(function() { 
    $(this).parents().filter(function() { 
     return this == someDiv[0]; 
    }).each(function() { 
     alert('foo'); 
    }) 
} 

myślę może również być w stanie uciec przy użyciu jQuery.inArray

if ($.inArray(someDiv, $(this).parents())) { 
     alert('boo'); 
} 
0

Nie uzyskasz pożądanego efektu po prostu używając CSS se lektor?

$('#div a').click(function() { ... }); 
10

Sprawdzanie (this).parents().index(someDiv) >= 0, jak sugeruje @Gareth, będzie działać dobrze.

Jednak korzystanie z jQuery ancestry plugin jest szybsze/bardziej wydajne .

+0

Dziękujemy! Wtyczka przodków i metody DOM są znacznie szybsze. – MichaelThompson

+1

A co powiesz na głosowanie? ;-) –

0

Spróbuj tego:

var someDiv = $('#div'); 

$('a').click(function() { 
    if ($.inArray($(this).parents().get(), someDiv.get(0)) { 
     alert('boo'); 
    } 
} 
0
var $element = $('a'); 
while ($element && !$element.is('someDiv')) { 
    var $element = $element.parent(); 
}; 
Powiązane problemy