Jednym ze problemów ze standardowym zdarzeniem mouseout
jest to, że wystrzeliwuje nie tylko wtedy, gdy kursor opuszcza obszar ekranu ograniczony zewnętrznym obwodem elementu, ale także gdy kursor unosi się nad innym elementem znajdującym się w tym obwodzie.Jak osiągnąć efekt mouseleave z absolutnie pozycjonowanymi potomkami?
Uzasadnieniem mouseleave
zdarzenia jQuery jest do sygnalizowania tylko moment, gdy kursor opuści obszar ograniczony zewnętrznym obwodzie elementu.
Niestety, wydaje się, że działa tylko wtedy, gdy element "przeszkadzający" jest potomkiem "zablokowanego" elementu. Jeśli element "przeszkadzający" znajduje się w miejscu, w którym znajduje się przez bezwzględne pozycjonowanie, wówczas gdy mysz najedzie na niego, zdarzenie mouseleave
na "zablokowanym" elemencie zostanie wyrzucone.
Na przykład, następujący kod HTML:
<div id="b-div">
<div id="d-div"><span>d</span></div>
</div>
<div id="c-div"><span>c</span></div>
... #d-div
jest bona fide potomkiem #b-div
, natomiast #c-div
nie jest, ale, ale możemy je projektować tak, że „przeszkadza "#b-div
wszystko to samo. Jest to przedstawione w this jsFiddle.
Jeśli teraz ktoś definiuje następujące wydarzenia na #b-div
:
$('#b-div').bind({
mouseenter: function() {
$(this).addClass('outlined');
},
mouseleave: function() {
$(this).removeClass('outlined');
}
});
... następnie unosi kursor w zewnętrznym obwodzie #b-div
„s powoduje niebieski zarys pojawiać się nad tym obwodzie, chyba mysz jest ponad #c-div
.
Czy istnieje sposób, aby uzyskać ten sam efekt z #b-div
i #c-div
jako mouseleave
osiąga z #b-div
i #d-div
?
EDYCJA: Naprawiłem przykład pokazany w jsFiddle. Oryginalna wersja tego przykładu pokazała niereprezentatywny specjalny przypadek, w którym cały element przeszkadzający pokrywa się z zablokowanym elementem. W tym szczególnym przypadku, pożądany efekt może być symulowany , symulowany poprzez zdefiniowanie tych samych zdarzeń zarówno na przeszkadzających, jak i zatkanych elementach, skutkiem czego, w rezultacie, obrócenie elementu przeszkadzającego w łatę zatkanego elementu. To nie zadziała, gdy element przeszkadzający nie jest w pełni zawarty w zewnętrznym obwodzie przeszkadzanego elementu (jak pokazano w poprawionym jsFiddle). Mówiąc bardziej ogólnie, każde rozwiązanie oparte na wykorzystaniu zdarzenia mouseover
na przeszkadzającym elemencie zakończy się niepowodzeniem, ponieważ problem polega na zapobieganiu (lub renderowaniu nieskuteczności) fałszywego mouseleave
na zablokowanym elemencie.
Masz na myśli to -> ** https: //jsfiddle.net/adeneo/q1Lgzr4c/1/** – adeneo
@adeneo: okazuje się, że mój oryginalny przykład ilustruje nieco niereprezentatywny przypadek specjalny; Zaktualizowałem przykład, aby to poprawić. Przepraszam za to. – kjo
To, co prawie działa, polega na sprawdzeniu "e.relatedTarget" https://jsfiddle.net/p5yf0dcs/2/ Problem polega na tym, że teraz nie stracisz podświetlenia podczas budowania z "b-div" –