2011-08-08 25 views
33

Próbuję użyć jQuery do otwierania/zamykania kontrolek "skrzynek" na stronie internetowej. Niestety, zamknięcie pudełka nie jest zbyt dobre, aby ponownie je otworzyć, gdy użytkownik kliknie na już otwarte okno. (Pola wzajemnie się wykluczają).Jak porównać dwa obiekty jQuery dla tożsamości?

Kod, którego używam, nie działa i nie jestem pewien dlaczego. Nadal zamykam pudełko, żeby otworzyć się na nowo, co nie jest pożądaną funkcjonalnością. Stworzyłem zmienną "val" do celów debugowania; w debuggerze pokazuje 'val' jako mający dokładnie taką samą wartość jak $ (this), co powinno uniemożliwić mu dostanie się do .slideToggle() wewnątrz instrukcji if, ale tego nie robi.

function openBox(index) 
{ 
    val = $('#box' + index); 
    $('.profilePageContentBox').each(function(){ 
     if($(this).css('display') != 'none') 
     { 
     if($(this) != val) 
     { 
      $(this).slideToggle(200); 
     } 
     } 
    }); 
    val.slideToggle(200); 
} 
+0

Czasami warto też spojrzeć na to: http://stackoverflow.com/questions/2436966/how-would-you-compare-jquery-objects – GnrlBzik

Odpowiedz

46

Korzystanie z funkcji $() zawsze utworzyć nowy obiekt, więc nie wiem co, swoją równość sprawdzić zawsze zawiedzie.

Na przykład:

var div = document.getElementById('myDiv'); 

$(div) === $(div); // false! 

Zamiast tego, można spróbować po prostu przechowywania rzeczywistych elementów DOM, ponieważ są to tylko mowa do wewnątrz obiektów jQuery.

val = $('#box'+index).get(0); 
... 
if (this !== val) { } 
+7

Dzięki! Jak tylko pozwoli mi StackOverflow, przyjmuję tę odpowiedź. Nie tylko odpowiedziałeś na to samo pytanie, ale wyjaśniłeś też koncepcyjną wadę, która mnie zepsuła - "daj mężczyźnie rybę, naucz człowieka łowić" – RonLugge

+2

Ten facet nauczył cię łowić na wędkę (kulawy) , dolna odpowiedź uczy, jak łowić gołymi rękami (BA)! –

0

Spróbuj tego:

function openBox(index) 
{ 
val=$('#box'+index); 
$('.profilePageContentBox').each(function(){ 
    if($(this).is(":visible")) 
    { 
     if(!$(this).is("#box"+index)) 
      $(this).slideToggle(200); 
    } 
}); 
val.slideToggle(200); 
} 
78

Można również zrobić:

if(val.is(this)) 
+1

Proste i proste do przodu. Świetna odpowiedź – Brandon

+2

najlepsza odpowiedź tutaj. sława! –

+0

To powinno być oznaczone jako właściwa odpowiedź. – mtpultz