2010-12-13 8 views
11

Korzystam z następującego kodu do animowania bloku. W moim kodzie div_animate() zasadniczo ukrywa <div> z określonym selektorem, jeśli jest on obecnie widoczny.Jak używać jQuery do określania, czy zdarzenie kliknięcia jest uruchamiane w określonym elemencie?

$(document).click(function(event){ 
    div_animate("#container"); 
}); 

muszę ustalić, czy użytkownik kliknął na dziecko #container a jeśli tak, return false; - o ile mogę powiedzieć, kod za to będzie wyglądać mniej więcej tak:

$(document).click(function(event){ 
    if (/* the event's target has a parent of #container */) { 
     return false; 
    } else { 
     div_animate("#container"); 
    } 
}); 

Jakieś myśli?

+0

Czy to ten sam problem jak [poprzednia pytanie] (http://stackoverflow.com/questions/4430277/jquery-animate-when-div-loses-focus) gdzie dałem ci [ten link] (http://stackoverflow.com/questions/714471/jquery-hide-element-when-clicked-anywhere-on- Strona)? – user113716

+0

@patrick To nie jest to samo co moje poprzednie pytanie, ale jest powiązane - ten problem pojawił się, gdy dodałem rozwiązanie z poprzedniego pytania. Podczas gdy Twój link był podobny do mojego pierwotnego pytania, nie uznałem go za przydatny. – Jazzerus

Odpowiedz

26

Najprostszą rzeczą byłoby:

if ($(event.target).is('#container *, #container')) // edited - thanks @gnarf 
    // is a child 
else 
    // is not a child 

Istnieją różne możliwości wyboru można dokonać za wykrywanie, czy jest to dziecko z tarczy (lub non-target) pojemnik; to tylko jeden. Alternatywą:

if ($(event.target).closest('#container').length) 
+1

Nie znalazłoby się '# container' na własną rękę, chociaż ... Może' $ (event.target) .closest ('# container'). Length' lub '.is ('# container, #container *') ' – gnarf

+1

Dokładnie tego chcę. Dzięki za szybką odpowiedź! – Jazzerus

+1

@gnarf ah tak masz rację - dodałem już "najbliższą" alternatywę, ale naprawię pierwszą. – Pointy

8

Można uniemożliwić działanie jeśli kliknięcie pochodzi lub w #container, tak:

$(document).click(function(event){ 
    var c = $("#container")[0]; 
    if (event.target == c || $.contains(c, event.target)) { 
     return false; 
    } else { 
     div_animate("#container"); 
    } 
}); 

Pierwsza kontrola jest, jeśli chodzi od samego #container, drugi jest, jeśli to pochodził od dziecka, które ma #container$.contains(). Zupełnie alternatywa, prostszym sposobem jest po prostu uniknąć bańki do document po kliknięciu na #container, tak:

$("#container").click(function(e) { 
    e.stopPropagation(); 
}); 
$(document).click(function() { 
    div_animate("#container"); 
}); 
+0

Oto moja wspaniała okazja, aby cię skarcić za to, że nie buforowałeś tego "#container", ale założę się, że edytowałeś je, zanim skończę pisać ten komentarz :-) – Pointy

+0

@Pointy - Zostało zbuforowane jako element DOM w pierwszej opublikowanej wersji ... –

+0

Nie Chodziło mi o buforowanie w zamknięciu wokół funkcji obsługi, czy coś takiego, ale głównie żartowałem. – Pointy

Powiązane problemy