Próbuję uchwycić zdarzenia myszy na elemencie z innym absolutnie pozycjonowanym elementem na nim.
W tej chwili zdarzenia na absolutnie pozycjonowanym elemencie uderzają w niego i podskakują do jego rodzica, ale chcę, aby był „przezroczysty” dla tych zdarzeń myszy i przekazywał je temu, co za nim stoi. Jak mam to zaimplementować?
pointer-events
istniało! W pewnym momencie mogę zmienić przyjętą odpowiedź na tę.pointer-events
wciąż nie jest super , ale jest coraz lepsza. Aby uzyskać bardziej zgodną opcję, przejdź do odpowiedzi @ JedSchmidt.Jeśli wszystko, czego potrzebujesz, to wycofanie się, możesz być w stanie zadowolić się tą
document.elementFromPoint
metodą przez:x
iy
ze zdarzenia dodocument.elementFromPoint
metody, aby uzyskać element pod spodem, a następnieźródło
Również miło wiedzieć ...
Zdarzenia wskaźnika mogą być wyłączone dla elementu nadrzędnego (prawdopodobnie przezroczystej div), a jednak włączone dla elementów potomnych. Jest to przydatne, jeśli pracujesz z wieloma nakładającymi się warstwami div, w których chcesz móc klikać elementy potomne dowolnej warstwy. W tym celu wszystkie divy rodzicielskie otrzymują,
pointer-events: none
a dzieci-kliknięcia otrzymują zdarzenia-wskaźnik ponownie włączone przezpointer-events: all
źródło
pointer-events:none
i nieuchronnym rozczarowaniu spowodowanym dotknięciem węzłów dziecięcych, oszczędzasz dzień :).parent * { pointer-events:all; }
dla dzieci?Powodem, dla którego nie otrzymujesz zdarzenia, jest to, że element pozycjonowany absolutnie nie jest dzieckiem elementu, który chcesz „kliknąć” (niebieski div). Najczystszym sposobem, jaki mogę wymyślić, jest umieszczenie absolutnego elementu jako dziecka tego, który chcesz kliknąć, ale zakładam, że nie możesz tego zrobić, bo nie opublikowałbyś tego pytania tutaj :)
Inną opcją byłoby zarejestrowanie modułu obsługi zdarzenia kliknięcia dla elementu absolutnego i wywołanie modułu obsługi kliknięcia dla niebieskiego elementu div, powodując, że oba będą migać.
Ze względu na sposób, w jaki wydarzenia pojawiają się w DOM, nie jestem pewien, czy istnieje dla ciebie prostsza odpowiedź, ale jestem bardzo ciekawy, czy ktoś ma jakieś sztuczki, o których nie wiem!
źródło
Dostępna jest wersja javascript, która ręcznie przekierowuje zdarzenia z jednego div na inny.
Wyczyściłem go i przekształciłem w wtyczkę jQuery.
Oto repozytorium Github: https://github.com/BaronVonSmeaton/jquery.forwardevents
Niestety cel, w którym go użyłem - nałożenie maski na Mapy Google nie uchwyciło zdarzeń kliknięcia i przeciągnięcia, a kursor myszy się nie zmienia, co obniża wrażenia użytkownika na tyle, że postanowiłem ukryć maskę pod IE i Operą - dwie przeglądarki, które nie obsługują zdarzeń wskaźnika.
źródło
Jeśli znasz elementy wymagające zdarzeń myszy, a twoja nakładka jest przezroczysta, możesz po prostu ustawić ich indeks Z na wartość wyższą niż nakładka. Wszystkie zdarzenia powinny oczywiście działać w tym przypadku we wszystkich przeglądarkach.
źródło