Mam DIV z zaklasyfikowaną foobar
i kilka DIV wewnątrz tego DIV, które są niesklasyfikowane, ale przypuszczam, że dziedziczą foobar
klasę:
$('.foobar').on('click', function() { /*...do stuff...*/ });
Chcę, żeby wystrzelił tylko po kliknięciu gdzieś w DIV, ale nie w DIV-y jego dzieci.
===
Lub!==
wykorzystuje „ścisłej równości Porównanie Algorithm” , podczas gdy==
i!=
używa „Streszczenie Równości Porównanie algorytmu” , czyli rodzaj przymusu. Ogólna mądrość polega na tym, aby zawsze stosować ścisłe porównanie, chyba że istnieje szczególna potrzeba użycia typu przymusu (ponieważ jego reguły są nieco skomplikowane) . W tym przypadku, ponieważ porównywane są obiekty, to naprawdę nie robi różnicy, ale przekonasz się, że większość ludzi nadal będzie przestrzegać ścisłego porównania.Jest inny sposób, który działa, jeśli nie masz nic przeciwko celowaniu w nowsze przeglądarki. Po prostu dodaj CSS
do wszystkich dzieci div, które chcesz uchwycić kliknięcie. Oto tabele wsparcia
http://caniuse.com/#feat=pointer-events
źródło
click
wyzwalacz programowego zdarzenia kliknięcia powinien być zablokowany?Możesz użyć bulgotania na swoją korzyść:
źródło
<a>
elementów potomnych . Jest tylko jeden problem: kiedy klikam je środkowym przyciskiem, zdarzenie nadal się uruchamia (testowane w Google Chrome). Czy istnieje wariant, który również temu zapobiega?Nie dostałem zaakceptowanej odpowiedzi do pracy, ale wydaje się, że to załatwia sprawę, przynajmniej w waniliowym JS.
źródło
this
, ponieważ obiekt, którythis
wskazuje zmiana może w zależności od zakresu i kontekstu, z którego jest on nazywanySpowoduje to zatrzymanie propagacji (propagacji)
click
zdarzenia na dowolnym elemencie (-ach).foobar
elementu (-ach), aby zdarzenie nie dotarło do.foobar
elementu (ów) w celu uruchomienia ich procedur obsługi zdarzeń.Oto demo: http://jsfiddle.net/bQQJP/
źródło
źródło
Miałem ten sam problem i wymyśliłem to rozwiązanie (na podstawie innych odpowiedzi)
Zasadniczo mówi, że jeśli celem jest div, to uruchom kod, w przeciwnym razie nic nie rób (nie ukrywaj go)
źródło
Mój przypadek jest podobny, ale jest to okazja, gdy masz kilka
foobar
-s i chcesz zamknąć tylko jeden - za jednym kliknięciem:Znajdź przypadek rodzica
Znajdź skrzynkę dla dziecka
źródło
Możesz użyć event.currentTarget. To zrobi zdarzenie kliknięcia tylko elemnt, który dostał zdarzenie.
źródło
Jeśli nie możesz używać
pointer-events: none;
i celujesz w nowoczesne przeglądarki, możesz użyćcomposedPath
do wykrycia bezpośredniego kliknięcia obiektu w następujący sposób:Możesz przeczytać więcej o compositePath tutaj: https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath
źródło
źródło