Mam problem z onmouseout
funkcją w absolutnie pozycjonowanym div. Gdy mysz uderza w element podrzędny w div, uruchamia się zdarzenie mouseout mouseout, ale nie chcę, aby było uruchamiane, dopóki mysz nie znajdzie się poza nadrzędnym, absolutnym div.
Jak mogę zapobiec mouseout
uruchamianiu zdarzenia, gdy trafi ono w element podrzędny BEZ jquery.
Wiem, że ma to coś wspólnego z bulgotaniem wydarzeń, ale nie mam szczęścia, aby dowiedzieć się, jak to rozwiązać.
Znalazłem podobny post tutaj: Jak wyłączyć zdarzenia mouseout wyzwalane przez elementy potomne?
Jednak to rozwiązanie wykorzystuje jQuery.
Odpowiedzi:
Zrobiłem szybkie demo JsFiddle, ze wszystkimi potrzebnymi CSS i HTML, sprawdź to ...
EDYTUJ STAŁE łącze do obsługi wielu przeglądarek http://jsfiddle.net/RH3tA/9/
PAMIĘTAJ, że to sprawdza tylko bezpośredniego rodzica, jeśli nadrzędny element div miał zagnieżdżone dzieci, musisz w jakiś sposób przejść przez elementy, które rodzice szukają „Elementu oryginalnego”
Przykład EDYCJI dla zagnieżdżonych dzieci
EDYCJA Naprawiono, miejmy nadzieję, w różnych przeglądarkach
I nowy JSFiddle , zaktualizowany link EDIT
źródło
mouseleave
to poprawna odpowiedźUżyj
onmouseleave
.Lub w jQuery użyj
mouseleave()
To jest dokładnie to, czego szukasz. Przykład:
lub w jQuery:
przykład jest tutaj .
źródło
onMouseLeave
jest tym, czego ostatecznie użyłem, ponieważ nie pęka.mouseleave
nie można anulować.Aby uzyskać prostsze, czyste rozwiązanie CSS, które działa w niektórych przypadkach ( IE11 lub nowsze ), można usunąć dzieci,
pointer-events
ustawiając je nanone
źródło
pointer-events
właściwościOto bardziej eleganckie rozwiązanie oparte na tym, co przedstawiono poniżej. odpowiada za zdarzenie kumulujące się z więcej niż jednego poziomu dzieci. Uwzględnia również problemy z różnymi przeglądarkami.
źródło
this
z wyłączeniem linii definicji funkcji @GregoryLewis wspomniał o rozwiązaniu problemu. Również dla większej obsługi wielu przeglądarek spróbuj tego: if (window.addEventListener) {document.getElementById ('parent'). AddEventListener ('mouseout', onMouseOut, true); } else if (window.attachEvent) {document.getElementById ('rodzic'). attachEvent ("onmouseout", onMouseOut); }Podziękowania dla Amjada Masada, który mnie zainspirował.
Mam następujące rozwiązanie, które wydaje się działać w IE9, FF i Chrome, a kod jest dość krótki (bez złożonego zamknięcia i poprzecznych elementów potomnych):
źródło
zamiast onmouseout użyj onmouseleave.
Nie pokazałeś nam swojego konkretnego kodu, więc nie mogę ci pokazać na twoim konkretnym przykładzie, jak to zrobić.
Ale to jest bardzo proste: po prostu zamień onmouseout na onmouseleave.
To wszystko :) Więc proste :)
Jeśli nie wiesz, jak to zrobić, zobacz wyjaśnienie:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onmousemove_leave_out
Tortowy spokój :) Ciesz się :)
źródło
Jeśli używasz jQuery, możesz również użyć funkcji „mouseleave”, która zajmuje się tym wszystkim za Ciebie.
Funkcja do_something uruchomi się, gdy mysz wejdzie dodargetdiv lub któregokolwiek z jej elementów podrzędnych, funkcja do_something_else uruchomi się tylko wtedy, gdy mysz opuści docelową dystrybucję i którekolwiek z jej elementów podrzędnych.
źródło
Myślę, że Quirksmode ma wszystkie potrzebne odpowiedzi (zachowanie bulgotania w różnych przeglądarkach i zdarzenia mouseenter / mouseleave ), ale myślę, że najczęstszym wnioskiem do tego bulgoczącego bałaganu jest użycie frameworka takiego jak JQuery lub Mootools (który ma centrum myszy i zdarzenia mouseleave , które są dokładnie tym, czego się spodziewałeś).
Zobacz, jak oni to robią, jeśli chcesz, zrób to sam
lub możesz stworzyć własną wersję Mootools typu „lean mean” tylko z częścią zdarzenia (i jej zależnościami).
źródło
Próbować
mouseleave()
Przykład:
;)
źródło
Znalazłem bardzo proste rozwiązanie,
po prostu użyj zdarzenia onmouseleave = "myfunc ()" niż zdarzenia onmousout = "myfunc ()"
W moim kodzie zadziałało !!
Przykład:
Ten sam przykład z funkcją mouseout:
Mam nadzieję, że to pomoże :)
źródło
Chociaż rozwiązanie , o którym wspomniałeś, wykorzystuje jquery, mouseenter i mouseleave są natywnymi zdarzeniami dom, więc możesz używać bez jquery.
źródło
Istnieją dwa sposoby radzenia sobie z tym.
1) Sprawdź wynik event.target w swoim wywołaniu zwrotnym, aby zobaczyć, czy pasuje do Twojego nadrzędnego div
2) Lub użyj przechwytywania zdarzeń i wywołaj event.stopPropagation w funkcji wywołania zwrotnego
źródło
Dzięki temu działa jak urok:
Ach, a
MyDiv
tag wygląda tak:W ten sposób, gdy mysz trafia do dziecka, wnuka itp. ...
style.display='none'
nie zostaje wykonana; ale kiedy onmouseout wychodzi z MyDiv, działa.Nie ma więc potrzeby zatrzymywania propagacji, używania timerów itp.
Dzięki za przykłady, mógłbym zrobić z nich ten kod.
Mam nadzieję, że to komuś pomoże.
Można również ulepszyć w ten sposób:
A potem znaczniki DIV, takie jak to:
Więc bardziej ogólnie, nie tylko dla jednego div i nie ma potrzeby dodawania
id="..."
na każdej warstwie.źródło
Jeśli masz dostęp do elementu, do którego zdarzenie jest dołączone wewnątrz
mouseout
metody, możesz użyć,contains()
aby sprawdzić, czyevent.relatedTarget
jest to element podrzędny, czy nie.Podobnie
event.relatedTarget
jak element, do którego przeszła mysz, jeśli nie jest to element podrzędny, zostałeś usunięty z elementu.źródło
Na Angular 5, 6 i 7
Potem dalej
źródło
Sprawdzam przesunięcie oryginalnego elementu, aby uzyskać współrzędne strony granic elementu, a następnie upewniam się, że akcja przesuwania myszy jest wyzwalana tylko wtedy, gdy wskaźnik myszy znajduje się poza tymi granicami. Brudne, ale działa.
źródło
źródło
Jeśli dodałeś (lub masz) klasę CSS lub identyfikator do elementu nadrzędnego, możesz zrobić coś takiego:
Tak więc rzeczy są wykonywane tylko wtedy, gdy zdarzenie jest w nadrzędnym div.
źródło
Chciałem tylko się z tobą czymś podzielić.
Trudno mi było z wydarzeniami
ng-mouseenter
ing-mouseleave
wydarzeniami.Studium przypadku:
Stworzyłem pływające menu nawigacyjne, które jest przełączane, gdy kursor znajduje się nad ikoną.
To menu znajdowało się na górze każdej strony.
ng-class="{down: vm.isHover}"
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Na razie wszystko było w porządku i działało zgodnie z oczekiwaniami.
Rozwiązanie jest czyste i proste.
Nadchodzący problem:
W konkretnym widoku mam listę elementów.
Dodałem panel akcji, gdy kursor znajduje się nad elementem listy.
Użyłem tego samego kodu co powyżej do obsługi zachowania.
Problem:
Zorientowałem się, że kiedy mój kursor znajduje się w pływającym menu nawigacyjnym, a także na górze elementu, występuje między sobą konflikt.
Pojawił się panel akcji, a pływająca nawigacja została ukryta.
Chodzi o to, że nawet jeśli kursor znajduje się nad pływającym menu nawigacyjnym, uruchamiany jest element listy ng-mouseenter.
Nie ma to dla mnie sensu, bo spodziewałbym się automatycznej przerwy w propagacji myszy.
Muszę powiedzieć, że byłem rozczarowany i spędziłem trochę czasu, aby dowiedzieć się tego problemu.
Pierwsze myśli:
Próbowałem użyć tych:
$event.stopPropagation()
$event.stopImmediatePropagation()
Połączyłem wiele zdarzeń wskaźnikowych (mousemove, mouveover, ...), ale żadne mi nie pomogło.
Rozwiązanie CSS:
Znalazłem rozwiązanie z prostą właściwością css, której używam coraz częściej:
Zasadniczo używam tego w ten sposób (na mojej liście elementów):
W tym trudnym przypadku zdarzenia ng-mouse nie będą już wyzwalane, a moje pływające menu nawigacyjne nie będzie się już zamykać, gdy kursor znajdzie się nad nim i nad elementem z listy.
Iść dalej:
Jak można się spodziewać, to rozwiązanie działa, ale mi się nie podoba.
Nie kontrolujemy naszych wydarzeń i jest źle.
Ponadto musisz mieć dostęp do
vm.isHover
lunety, aby to osiągnąć i może to być niemożliwe lub niemożliwe, ale w jakiś sposób brudne.Mógłbym zrobić skrzypce, gdyby ktoś chciał spojrzeć.
Nie mam jednak innego rozwiązania ...
To długa historia i nie mogę ci dać ziemniaka, więc wybacz mi przyjacielu.
W każdym razie
pointer-events: none
jest życie, więc pamiętaj o tym.źródło