Chcę funkcji, która mówi mi, nad którym elementem znajduje się kursor myszy.
Na przykład, jeśli mysz użytkownika znajduje się nad tym obszarem tekstowym (z identyfikatorem wmd-input
), wywołanie window.which_element_is_the_mouse_on()
będzie funkcjonalnie równoważne z $("#wmd-input")
.
javascript
dom
mouse
Tom Lehman
źródło
źródło
event.target
czy cokolwiek innegoevent.target
?event
jest i jak do tego doszłoW nowszych przeglądarkach możesz wykonać następujące czynności:
To da ci NodeList elementów, nad którymi aktualnie znajduje się mysz w kolejności dokumentów. Ostatni element w NodeList jest najbardziej szczegółowy, każdy poprzedzający powinien być rodzicem, dziadkiem i tak dalej.
źródło
<li>
chwilę na inne<li>
elementy.$(':hover')
ale to w zasadzie to samo: jsfiddle.net/pmrotule/2pks4tf6(function(){ var q = document.querySelectorAll(":hover"); return q[q.length-1]; })()
mousemove
może zaszkodzić wydajnościChociaż poniższe informacje mogą w rzeczywistości nie odpowiadać na pytanie, ponieważ jest to pierwszy wynik wyszukiwania w Google (pracownik Google może nie zadać dokładnie tego samego pytania :), mam nadzieję, że dostarczy dodatkowych informacji.
W rzeczywistości istnieją dwa różne podejścia do uzyskania listy wszystkich elementów, nad którymi aktualnie znajduje się mysz (być może w przypadku nowszych przeglądarek):
Podejście „strukturalne” - rosnąco drzewo DOM
Jak w odpowiedzi Dhermana , można zadzwonić
Jednak zakłada się, że tylko dzieci będą nakładać na swoich przodków, co zwykle ma miejsce, ale nie jest to prawdą w ogóle, szczególnie w przypadku SVG, w którym elementy w różnych gałęziach drzewa DOM mogą się nakładać.
Podejście „wizualne” - oparte na nakładaniu się „wizualnych”
Ta metoda wykorzystuje
document.elementFromPoint(x, y)
do znalezienia najwyższego elementu, tymczasowego ukrycia go (ponieważ odzyskujemy go natychmiast w tym samym kontekście, przeglądarka w rzeczywistości tego nie wyrenderuje), a następnie przejdź do znajdowania drugiego najwyższego elementu ... Wygląda trochę dziwnie, ale zwraca to, czego się spodziewasz, gdy np. w drzewie występują elementy rodzeństwa, które się blokują. Proszę znaleźć ten post, aby uzyskać więcej informacji,Wypróbuj oba i sprawdź ich różne zwroty.
źródło
Document.elementsFromPoint(x, y)
stackoverflow.com/a/31805883/1059828elementFromPoint()
pobiera tylko pierwszy element w drzewie DOM. To przeważnie nie wystarcza dla potrzeb programistów. Aby uzyskać więcej niż jeden element na przykład w bieżącej pozycji wskaźnika myszy, jest to funkcja, której potrzebujesz:Zwraca tablicę wszystkich obiektów elementów w danym punkcie. Po prostu podaj wartości X i Y myszy do tej funkcji.
Więcej informacji znajduje się tutaj: DocumentOrShadowRoot.elementsFromPoint ()
W przypadku bardzo starych przeglądarek, które nie są obsługiwane, możesz użyć tej odpowiedzi jako rozwiązania zastępczego.
źródło
Zdarzenia po najechaniu kursorem myszy pojawiają się w dymkach, więc możesz umieścić jednego słuchacza na ciele i poczekać, aż się rozwiną, a następnie złapać
event.target
lubevent.srcElement
:źródło
document.elementFromPoint(x, y)
.Poniższy kod pomoże Ci uzyskać element wskaźnika myszy. Wynikowe elementy zostaną wyświetlone w konsoli.
źródło
e.clientX
ie.clientY
zamiast tego (testowane w przeglądarce Firefox 59).Możesz spojrzeć na cel
mouseover
wydarzenia na jakimś odpowiednim przodku:Oto demo.
źródło
źródło
Demo: D
Przesuń kursor myszy w oknie fragmentu kodu: D
źródło
Celem
mousemove
zdarzenia DOM jest znajdujący się najwyżej element DOM pod kursorem, gdy porusza się mysz:Jest to podobne do rozwiązania @Philip Walton, ale nie wymaga jQuery ani setInterval.
źródło
Możesz użyć tego selektora, aby podkopać obiekt, a następnie manipulować nim jako obiektem jQuery:
źródło
Oto rozwiązanie dla tych, którzy nadal mogą mieć problemy. Chcesz dodać
mouseover
zdarzenie do elementu „nadrzędnego” elementu podrzędnego, który chcesz wykryć. Poniższy kod pokazuje, jak się do tego zabrać.Demo na CodePen
źródło
Zacznę od stwierdzenia, że nie polecam stosowania metody, którą mam zamiar zasugerować. Jest o wiele lepiej zdarzeniami rozwoju i wiązania zdarzeń używać tylko do elementów jesteś zainteresowany wiedząc, czy mysz jest nad z
mouseover
,mouseout
,mouseenter
,mouseleave
, itd.Jeśli absolutnie musisz mieć możliwość wiedzieć, który element znajduje się nad myszą, musiałbyś napisać funkcję, która wiąże
mouseover
zdarzenie ze wszystkim w DOM, a następnie przechowywać cokolwiek, co znajduje się w bieżącym elemencie w jakiejś zmiennej.Mógłbyś coś takiego:
Zasadniczo stworzyłem natychmiastową funkcję, która ustawia zdarzenie na wszystkich elementach i przechowuje bieżący element w zamknięciu, aby zminimalizować twój ślad.
Oto działające demo, które wywołuje
window.which_element_is_the_mouse_on
co sekundę i rejestruje na konsoli element, na którym aktualnie znajduje się mysz.http://jsfiddle.net/LWFpJ/1/
źródło