Eu quero ser capaz de detectar quando o mouse sai da janela para que eu possa impedir que eventos sejam disparados enquanto o mouse do usuário está em outro lugar.
Alguma ideia de como fazer isso?
Eu quero ser capaz de detectar quando o mouse sai da janela para que eu possa impedir que eventos sejam disparados enquanto o mouse do usuário está em outro lugar.
Alguma ideia de como fazer isso?
Respostas:
Lembre-se de que minha resposta envelheceu muito.
Este tipo de comportamento é geralmente desejado durante a implementação do comportamento arrastar e soltar em uma página html. A solução abaixo foi testada no IE 8.0.6, FireFox 3.6.6, Opera 10.53 e Safari 4 em uma máquina MS Windows XP.
Primeiro, uma pequena função de Peter-Paul Koch; manipulador de eventos para vários navegadores:
Em seguida, use este método para anexar um manipulador de eventos ao evento mouseout dos objetos de documento:
Por fim, aqui está uma página html com o script incorporado para depuração:
fonte
Se você está usando jQuery, que tal este código curto e doce -
Este evento será acionado sempre que o mouse não estiver na sua página como você deseja. Basta alterar a função para fazer o que quiser.
E você também pode usar:
Para disparar quando o mouse entrar de volta na página novamente.
Fonte: https://stackoverflow.com/a/16029966/895724
fonte
Isso funciona para mim:
fonte
addEvent
?if (!evt.toElement && !evt.relatedTarget)
Para detectar a saída do mouse sem levar em conta a barra de rolagem e o campo de preenchimento automático ou inspecionar:
Explicações das condições:
============================ EDITAR =========================== ======
document.addEventListener ("mouseleave") parece não ser acionado na nova versão do firefox, mouseleave precisa ser anexado a um elemento como o corpo ou um elemento filho.
Eu sugiro usar ao invés
Ou
fonte
Usar o evento onMouseLeave evita bolhas e permite detectar facilmente quando o mouse sai da janela do navegador.
http://www.w3schools.com/jsref/event_onmouseleave.asp
fonte
document.onmouseleave = function() { alert('You left!') };
não use document.body que dispara uma barra de rolagem que encolhe o corpo! Código para prevenir fogo em elementos não é necessário. Boa explicação: developer.mozilla.org/en-US/docs/Web/API/Element/…Nenhuma dessas respostas funcionou para mim. Agora estou usando:
Estou usando isso para arrastar e soltar o widget de upload de arquivos. Não é absolutamente preciso, sendo acionado quando o mouse chega a uma certa distância da borda da janela.
fonte
Tentei todas as opções acima, mas nada parece funcionar conforme o esperado. Depois de um pouco de pesquisa descobri que e.relatedTarget é o html apenas antes de o rato sai da janela .
Então ... eu acabei com isso:
Informe-nos se encontrar algum problema ou melhoria!
Atualização de 2019
(como o usuário 1084282 descobriu)
fonte
relatedTarget
é nulo quando o mouse sai da janela. Inspirado na resposta de @ user1084282, mude para isto:if(!e.relatedTarget && !e.toElement) { ... }
e funcionaif(!e.relatedTarget && !e.toElement)
vez da condição na resposta real. Ele detecta que o mouse saiu do corpo do documento.Retiro o que disse. É possível. Eu escrevi esse código, funciona perfeitamente.
trabalha em cromo, firefox, ópera. Aint testado no IE, mas presume que funciona.
editar. O IE, como sempre, causa problemas. Para fazer funcionar no IE, substitua os eventos de janela para documento:
combine-os para a detecção do cursor crossbrowser kick ass o0: P
fonte
aplique este css:
Isso garante que o elemento html ocupe toda a altura da janela.
aplique este jquery:
O problema com o mouseover e o mouseout é que, se você passar o mouse sobre / fora do html para um elemento filho, o evento será ativado. A função que dei não é acionada ao passar o mouse para um elemento filho. Só é ativado quando você move o mouse para fora / dentro da janela
apenas para você saber que pode fazer isso quando o usuário passar o mouse na janela:
fonte
Tentei um após o outro e encontrei a melhor resposta na época:
https://stackoverflow.com/a/3187524/985399
Eu pulo os navegadores antigos, então tornei o código mais curto para funcionar em navegadores modernos (IE9 +)
Aqui você vê o suporte do navegador
Isso foi bem curto eu pensei
Mas ainda havia um problema porque o "mouseout" disparava em todos os elementos do documento .
Para evitar que isso aconteça, use o mouseeleave (IE5.5 +). Veja a boa explicação no link.
O código a seguir funciona sem acionar elementos dentro do elemento para estar dentro ou fora dele. Tente também soltar e arrastar para fora do documento.
Você pode definir o evento em qualquer elemento HTML. Não
document.body
ative o evento , porque a barra de rolagem do Windows pode encolher o corpo e disparar quando o ponteiro do mouse está sobre a barra de rolagem quando você deseja rolar, mas não deseja acionar um evento mouseLeave sobre ele. Emdocument
vez disso, ative-o, como no exemplo.fonte
Talvez se você estiver ouvindo OnMouseOver constantemente na tag do corpo, então callback quando o evento não estiver ocorrendo, mas, como Zack afirma, isso pode ser muito feio, porque nem todos os navegadores lidam com eventos da mesma maneira, há até alguns possibilidade de você perder o MouseOver mesmo por estar sobre um div na mesma página.
fonte
Talvez isso ajudasse alguns dos que viriam aqui mais tarde.
window.onblur
edocument.mouseout
.window.onblur
é acionado quando:Ctrl+Tab
ouCmd+Tab
.Basicamente, a qualquer momento que a guia do navegador perde o foco.
document.mouseout
é acionado quando:Ctrl+Tab
ouCmd+Tab
.Basicamente, em qualquer caso, quando o cursor sai do documento.
fonte
window.onblur
também. +1Isso pode ser um pouco hackeado, mas só disparará quando o mouse sair da janela. Continuei capturando eventos infantis e isso resolveu
fonte
fonte
Isso funcionou para mim. Uma combinação de algumas das respostas aqui. E eu incluí o código mostrando um modelo apenas uma vez. E o modelo desaparece quando clicado em qualquer outro lugar.
fonte
Veja
mouseover
emouseout
.fonte
Eu não testei isso, mas meu instinto seria fazer uma chamada de função OnMouseOut na tag body.
fonte
Isso funcionará no Chrome,
fonte