Estou tendo problemas com a onmouseout
função em uma div positonada absoluta. Quando o mouse atinge um elemento filho na div, o evento mouseout é acionado, mas não quero que ele seja acionado até que o mouse esteja fora do pai, div absoluto.
Como impedir que o mouseout
evento seja disparado quando ele atinge um elemento filho sem jquery.
Eu sei que isso tem algo a ver com a agitação do evento, mas não estou tendo sorte em descobrir como resolver isso.
Encontrei um post semelhante aqui: Como desativar os eventos de mouseout acionados por elementos filho?
No entanto, essa solução usa jQuery.
Respostas:
Fiz uma rápida demonstração do JsFiddle, com todo o CSS e HTML necessários, confira ...
Link EDIT FIXED para suporte entre navegadores http://jsfiddle.net/RH3tA/9/
Observe que isso só verifica o pai imediato, se o div pai tiver aninhado filhos, você precisará percorrer os elementos pais procurando o "Elemento original"
Exemplo EDIT para filhos aninhados
EDIT Corrigido para esperançosamente cross-browser
E um novo link atualizado do JSFiddle , EDIT
fonte
mouseleave
é a resposta corretaUse
onmouseleave
.Ou, no jQuery, use
mouseleave()
É exatamente o que você está procurando. Exemplo:
ou, em jQuery:
um exemplo está aqui .
fonte
onMouseLeave
foi o que acabei usando também, pois não borbulha.mouseleave
não pode ser cancelável.Para uma solução CSS pura e simples, que funciona em alguns casos ( IE11 ou mais recente ), é possível remover as crianças
pointer-events
configurando-as paranone
fonte
pointer-events
imóvelAqui está uma solução mais elegante com base no que veio abaixo. é responsável pelo evento borbulhando em mais de um nível de crianças. Ele também é responsável por problemas entre navegadores.
fonte
this
da linha de definição de função que @GregoryLewis mencionou corrigiu o problema. Também para obter mais suporte entre navegadores, tente o seguinte: if (window.addEventListener) {document.getElementById ('pai'). AddEventListener ('mouseout', onMouseOut, true); } else if (window.attachEvent) {document.getElementById ('pai'). attachEvent ("onmouseout", onMouseOut); }Graças a Amjad Masad que me inspirou.
Eu tenho a seguinte solução que parece funcionar no IE9, FF e Chrome e o código é bastante curto (sem o fechamento complexo e as coisas transversais da criança):
fonte
em vez de onmouseout, use onmouseleave.
Você não nos mostrou seu código específico; portanto, não posso mostrar em seu exemplo específico como fazê-lo.
Mas é muito simples: basta substituir onmouseout por onmouseleave.
Isso é tudo :) Então, simples :)
Se não tiver certeza de como fazê-lo, consulte a explicação em:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onmousemove_leave_out
Paz de bolo :) Divirta-se :)
fonte
Se você estiver usando o jQuery, também poderá usar a função "mouseleave", que lida com tudo isso para você.
do_something será acionado quando o mouse entrar no objeto de entretenimento ou em qualquer um de seus filhos, do_something_else somente será acionado quando o mouse sair do objeto de entretenimento e de qualquer um de seus filhos.
fonte
Acho que o Quirksmode tem todas as respostas que você precisa (comportamento de borbulhamento de navegadores diferentes e eventos do mouseenter / mouseleave ), mas acho que a conclusão mais comum dessa confusão de borbulhamento de eventos é o uso de uma estrutura como JQuery ou Mootools (que possui o mouseenter e eventos do mouse , que são exatamente o que você intuiu que aconteceria).
Veja como eles fazem isso, se você quiser, faça você mesmo
ou você pode criar sua versão personalizada do "Mootools" com apenas a parte do evento (e suas dependências).
fonte
Experimentar
mouseleave()
Exemplo:
;)
fonte
Eu encontrei uma solução muito simples,
basta usar o evento onmouseleave = "myfunc ()" do que o evento onmousel = "myfunc ()"
No meu código funcionou !!
Exemplo:
Mesmo exemplo com a função mouseout:
Espero que ajude :)
fonte
Embora a solução a que você se referiu use jquery, mouseenter e mouseleave são eventos dom nativos, portanto, você pode usá-lo sem o jquery.
fonte
Existem duas maneiras de lidar com isso.
1) Verifique o resultado event.target no seu retorno de chamada para ver se ele corresponde ao seu div principal
2) Ou use a captura de eventos e chame event.stopPropagation na função de retorno de chamada
fonte
Eu faço isso funcionar como um encanto com isso:
Ah, e
MyDiv
tag é assim:Dessa forma, quando onmouseout vai para um filho, neto, etc ... o
style.display='none'
não é executado; mas quando onmouseout sai do MyDiv, ele é executado.Portanto, não há necessidade de interromper a propagação, usar temporizadores, etc ...
Obrigado por exemplos, eu poderia fazer esse código a partir deles.
Espero que isso ajude alguém.
Também pode ser melhorado assim:
E as tags DIVs assim:
Então, mais geral, não apenas para uma div e não há necessidade de adicionar
id="..."
em cada camada.fonte
Se você tiver acesso ao elemento ao qual o evento está anexado dentro do
mouseout
método, poderácontains()
ver se oevent.relatedTarget
elemento é filho ou não.Como
event.relatedTarget
é o elemento para o qual o mouse foi transferido, se não for um elemento filho, você passou o mouse pelo elemento.fonte
Nos angulares 5, 6 e 7
Em seguida
fonte
Verifico o deslocamento do elemento original para obter as coordenadas da página nos limites do elemento e, em seguida, asseguro que a ação de mouseout seja acionada apenas quando o mouseout estiver fora desses limites. Sujo, mas funciona.
fonte
fonte
Se você adicionou (ou possui) uma classe ou ID CSS ao elemento pai, poderá fazer algo assim:
Portanto, as coisas só são executadas quando o evento está na div pai.
fonte
Eu só queria compartilhar algo com você.
Eu tenho algum tempo duro com
ng-mouseenter
eng-mouseleave
eventos.O estudo de caso:
Criei um menu de navegação flutuante que é alternado quando o cursor está sobre um ícone.
Este menu estava no topo de cada página.
ng-class="{down: vm.isHover}"
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Por enquanto, estava tudo bem e funcionou como esperado.
A solução é limpa e simples.
O problema de entrada:
Em uma visão específica, eu tenho uma lista de elementos.
Eu adicionei um painel de ação quando o cursor está sobre um elemento da lista.
Eu usei o mesmo código acima para lidar com o comportamento.
O problema:
Eu descobri que quando meu cursor está no menu de navegação flutuante e também na parte superior de um elemento, há um conflito entre eles.
O painel de ação apareceu e a navegação flutuante foi ocultada.
O fato é que, mesmo que o cursor esteja sobre o menu de navegação flutuante, o elemento da lista ng-mouseenter é acionado.
Não faz sentido para mim, porque eu esperaria uma interrupção automática dos eventos de propagação do mouse.
Devo dizer que fiquei desapontado e passo algum tempo para descobrir esse problema.
Primeiras reflexões:
Eu tentei usar estes:
$event.stopPropagation()
$event.stopImmediatePropagation()
Combinei muitos eventos de ponteiro ng (movimento, movimentação, ...), mas nenhum me ajudou.
Solução CSS:
Encontrei a solução com uma propriedade css simples que uso cada vez mais:
Basicamente, eu uso assim (nos elementos da minha lista):
Com este complicado, os eventos do ng-mouse não serão mais acionados e meu menu de navegação flutuante não se fechará mais quando o cursor estiver sobre ele e sobre um elemento da lista.
Ir além:
Como você pode esperar, esta solução funciona, mas eu não gosto.
Nós não controlamos nossos eventos e isso é ruim.
Além disso, você deve ter acesso ao
vm.isHover
escopo para isso e pode não ser possível ou possível, mas sujo de uma maneira ou de outra.Eu poderia mexer se alguém quiser olhar.
No entanto, não tenho outra solução ...
É uma longa história e não posso lhe dar uma batata, por favor, perdoe-me, meu amigo.
Enfim,
pointer-events: none
é vida, então lembre-se.fonte