Obecnie używam jQuery, aby div mógł być klikalny, aw tym div też mam kotwice. Problem, na który wpadam, polega na tym, że po kliknięciu kotwicy uruchamiane są oba zdarzenia kliknięcia (dla div i kotwicy). Jak zapobiec uruchamianiu zdarzenia div po kliknięciu kotwicy?
Oto uszkodzony kod:
JavaScript
var url = $("#clickable a").attr("href");
$("#clickable").click(function() {
window.location = url;
return true;
})
HTML
<div id="clickable">
<!-- Other content. -->
<a href="http://foo.com">I don't want #clickable to handle this click event.</a>
</div>
źródło
if( e.target !== this) return;
w rodzicu jest lepsze niże.stopPropagation()
w dziecku, ponieważ nigdy nie wiadomo, czy ktoś inny dołącza do niego jakiś program obsługi lub czy biblioteka musi dołączyć program obsługi do dziecka (i nie chcesz zadzierać z kodem biblioteki). To lepsze rozdzielenie obaw.if( e.target !== this) return;
kontroli w obiekcie nadrzędnym oznacza, że jeśli zostanie kliknięte dowolne inne dziecko tego rodzica, które nie ma własnych procedur obsługi onClick, nic się nie dzieje. Jest to więc bezużyteczne w sytuacji, gdy masz np. Klikalny div rodzica.e.stopPropagation()
działa jednak dobrze.Użyj metody stopPropagation , zobacz przykład:
Jak powiedział jQuery Docs:
Pamiętaj, że nie przeszkadza to innym słuchaczom w obsłudze tego zdarzenia (np. Więcej niż jeden moduł obsługi kliknięcia dla przycisku), jeśli nie jest to pożądany efekt, musisz go użyć
stopImmediatePropagation
.źródło
Oto moje rozwiązanie dla wszystkich, którzy szukają kodu innego niż jQuery (czysty javascript)
Twój kod nie zostanie wykonany, jeśli klikniesz na dziecko rodzica
źródło
window.event
, co odradza MDN: developer.mozilla.org/en-US/docs/Web/API/Window/event . Jeśli możesz poświęcić czas, byłbym wdzięczny, jeśli możesz skomentować, dlaczego wykorzystałeświndow.event
(być może jest to problem, który istniał w 2015 roku lub nie zrozumiałem powodu).możesz także spróbować tego
źródło
Jeśli nie zamierzasz wchodzić w interakcje z wewnętrznym elementem / elementami, rozwiązanie CSS może być dla Ciebie przydatne.
Wystarczy ustawić element wewnętrzny na
pointer-events: none
w Twoim przypadku:
lub ogólnie kierować na wszystkie elementy wewnętrzne:
Ten prosty hack zaoszczędził mi dużo czasu podczas programowania w ReactJS
Obsługę przeglądarki można znaleźć tutaj: http://caniuse.com/#feat=pointer-events
źródło
Jeśli masz wiele elementów w klikalnym div, powinieneś to zrobić:
źródło
Użycie
return false;
lube.stopPropogation();
nie pozwoli na wykonanie dalszego kodu. W tym momencie zatrzyma przepływ.źródło
Pisanie, jeśli ktoś potrzebuje (pracował dla mnie):
Z tego rozwiązania.
źródło
Inline Alternative:
źródło
Oto przykład użycia Angulara 2+
Na przykład, jeśli chcesz zamknąć moduł modalny, jeśli użytkownik kliknie poza nim:
źródło
Musisz powstrzymać wydarzenie przed dotarciem do rodzica (div). Zobacz część o propagacji tutaj i informacje o interfejsie API specyficznym dla jQuery tutaj .
źródło
źródło
Aby określić jakiś element podrzędny jako niemożliwy do zapisania, napisz hierarchię css, jak w poniższym przykładzie.
W tym przykładzie zatrzymuję propagację do dowolnych elementów (*) wewnątrz td wewnątrz tr wewnątrz tabeli z klasą „.subtable”
źródło
ignoreParent () jest czystym rozwiązaniem JavaScript.
Działa jako warstwa pośrednia, która porównuje współrzędne kliknięcia myszy ze współrzędnymi elementu / elementów potomnych. Dwa proste kroki wdrożenia:
1. Umieść kod ignoreParent () na swojej stronie.
2. Zamiast oryginalnego obiektu nadrzędnego onclick = "parentEvent ();" , pisać:
Możesz przekazać identyfikatory dowolnej liczby elementów potomnych do funkcji i wykluczyć inne.
Jeśli klikniesz jeden z elementów potomnych, zdarzenie nadrzędne nie zostanie uruchomione. Jeśli kliknąłeś element nadrzędny, ale nie element podrzędny [podany jako argument], zdarzenie nadrzędne zostanie uruchomione.
kod ignoreParent () na Github
źródło
Jeśli jest w kontekście wbudowanym, w HTML spróbuj tego:
źródło
W przypadku, gdy ktoś miał ten problem przy użyciu React, tak to rozwiązałem.
scss:
Renderowanie komponentu ():
Dodając funkcję onClick do modalnego elementu potomnego (div treści), kliknięcia myszy zapobiegają osiągnięciu funkcji „closeLogin” elementu nadrzędnego.
To załatwiło sprawę i byłem w stanie stworzyć efekt modalny z 2 prostymi divami.
źródło
dodaj
a
w następujący sposób:lub
return false;
z modułu obsługi kliknięć dla#clickable
:źródło
Wszystkie rozwiązania są skomplikowane i jscript. Oto najprostsza wersja:
źródło
źródło