Existe uma maneira de detectar se um botão do mouse está atualmente pressionado em JavaScript?
Eu sei sobre o evento "mousedown", mas não é disso que eu preciso. Depois de pressionar o botão do mouse, desejo detectar se ele ainda está pressionado.
Isso é possível?
Respostas:
Em relação à solução do Pax: não funciona se o usuário clicar em mais de um botão intencionalmente ou acidentalmente. Não me pergunte como eu sei :-(.
O código correto deve ser assim:
Com o teste como este:
Se você quiser saber qual botão foi pressionado, esteja preparado para fazer do mouseDown uma matriz de contadores e conte-os separadamente para botões separados:
Agora você pode verificar exatamente quais botões foram pressionados:
Agora, esteja avisado de que o código acima funcionaria apenas para navegadores compatíveis com o padrão que passam um número de botão a partir de 0 ou superior. O IE usa uma máscara de bit dos botões pressionados no momento:
Então ajuste seu código de acordo! Eu deixo isso como um exercício.
E lembre-se: o IE usa um objeto de evento global chamado… "event".
Aliás, o IE possui um recurso útil no seu caso: quando outros navegadores enviam "botão" apenas para eventos de botão do mouse (onclick, onmousedown e onmouseup), o IE o envia com onmousemove também. Assim, você pode começar a ouvir onmousemove quando precisar conhecer o estado do botão e verificar o botão evt.botton assim que o conseguir - agora você sabe quais botões do mouse foram pressionados:
Claro que você não ganha nada se ela fingir de morta e não se mover.
Links relevantes:
Atualização # 1 : Não sei por que carreguei o documento. Estilo do código do corpo. Será melhor anexar manipuladores de eventos diretamente ao documento.
fonte
event.buttons
a qualquer gatilho de evento que estiver usando, sem variáveis salvas externas. Fiz uma pergunta totalmente nova (porque meu evento de mouse nem sempre é acionado, portanto essa solução não funciona para mim) e recebi essa resposta em talvez 5 minutos no máximo.Essa é uma pergunta antiga, e as respostas aqui parecem advogar principalmente o uso
mousedown
e omouseup
acompanhamento de pressionar um botão. Mas, como outros já apontaram,mouseup
só serão acionados quando executados no navegador, o que pode levar à perda do controle do estado do botão.No entanto, MouseEvent (agora) indica quais botões estão pressionados no momento:
MouseEvent.buttons
MouseEvent.which
(buttons
será indefinido para o Safari) Nota:which
usa números diferentes dosbuttons
cliques direito e médio.Quando registrado
document
,mousemove
será acionado imediatamente assim que o cursor entrar novamente no navegador; portanto, se o usuário liberar fora, o estado será atualizado assim que o mouse voltar para dentro.Uma implementação simples pode se parecer com:
Se forem necessários cenários mais complicados (botões diferentes / vários botões / teclas de controle), consulte a documentação do MouseEvent. Quando / se o Safari melhorar o jogo, isso deve ficar mais fácil.
fonte
e.buttons
será1+2=3
,e.buttons === 1
será falso). Se você quiser verificar se o botão principal é baixo, mas não se preocupam com quaisquer outros estados de botão, faça o seguinte:(e.buttons & 1) === 1
MouseEvent.buttons
, parece que isso7
significa que ele acha que os botões Primário, Secundário e Auxiliar estão todos pressionados juntos. Não sei por que esse seria o caso - você está usando um mouse avançado? Se assim for, talvez valha a pena tentar com um básico. Se você está apenas começando, pode usar uma verificação bit a bit para garantir que o botão esquerdo seja pressionado e ignorar outros. por exemplo.MouseEvent.buttons & 1 === 1
.Eu acho que a melhor abordagem para isso é manter seu próprio registro do estado do botão do mouse, da seguinte maneira:
e depois, mais tarde no seu código:
fonte
a solução não é boa. pode-se "reduzir o mouse" no documento e, em seguida, "passar o mouse" fora do navegador e, nesse caso, o navegador ainda estaria pensando que o mouse está desativado.
a única boa solução é usar o objeto IE.event.
fonte
Sei que este é um post antigo, mas achei que o rastreamento do botão do mouse usando o mouse para cima / baixo era um pouco desajeitado, então encontrei uma alternativa que pode agradar a alguns.
O seletor: active lida com o clique do mouse muito melhor do que o mouse para cima / baixo, você só precisa de uma maneira de ler esse estado no evento onmousemove. Para isso, eu precisava trapacear e confiei no fato de que o cursor padrão é "auto" e apenas mudei para "default", que é o que o auto seleciona por padrão.
Você pode usar qualquer coisa no objeto retornado pelo getComputedStyle que possa ser usado como um sinalizador sem alterar a aparência da sua página, por exemplo, cor da borda.
Eu gostaria de definir meu próprio estilo definido pelo usuário na seção: active, mas não consegui fazer isso funcionar. Seria melhor se fosse possível.
fonte
O seguinte snippet tentará executar a função "doStuff" 2 segundos após o evento mouseDown ocorrer em document.body. Se o usuário levantar o botão, o evento mouseUp ocorrerá e cancelará a execução atrasada.
Eu aconselho o uso de algum método para anexação de eventos entre navegadores - a configuração explícita das propriedades de mouse e mouse foi feita para simplificar o exemplo.
fonte
Curto e grosso
Não sei por que nenhuma das respostas anteriores funcionou para mim, mas descobri essa solução durante um momento eureka. Não só funciona, mas também é mais elegante:
Adicionar à etiqueta do corpo:
Em seguida, teste e execute
myfunction()
se fordown
igual a1
:fonte
Você pode combinar o @Pax e minhas respostas para também obter a duração em que o mouse ficou inativo:
Depois, mais tarde:
fonte
Você precisa lidar com o MouseDown e o MouseUp e definir alguma bandeira ou algo para rastreá-lo "mais tarde na estrada" ... :(
fonte
Se você estiver trabalhando em uma página complexa com manipuladores de eventos de mouse existentes, recomendo manipular o evento na captura (em vez de bolha). Para fazer isso, basta definir o terceiro parâmetro de
addEventListener
comotrue
.Além disso, convém verificar
event.which
se você está lidando com a interação real do usuário e não com os eventos do mouse, por exemploelem.dispatchEvent(new Event('mousedown'))
.Adicione o manipulador ao documento (ou janela) em vez de document.body é importante porque ele garante que os eventos de mouse fora da janela ainda sejam registrados.
fonte
Usando a API MouseEvent , para verificar o botão pressionado, se houver:
Retorno :
fonte
Usando o jQuery, a solução a seguir lida com o "arraste da página e solte o caso".
Não sei como ele lida com vários botões do mouse. Se houvesse uma maneira de iniciar o clique fora da janela, traga o mouse para dentro da janela e provavelmente isso também não funcionaria corretamente.
fonte
Abaixo do exemplo do jQuery, quando o mouse está sobre $ ('. Element'), a cor muda de acordo com o botão do mouse pressionado.
fonte
Como disse o @Jack, quando
mouseup
acontece fora da janela do navegador, não temos conhecimento disso ...Este código (quase) funcionou para mim:
Infelizmente, não receberei o
mouseup
evento em um desses casos:fonte
Bem, você não pode verificar se está inativo após o evento, mas pode verificar se está ativo ... se ativo .. significa que não está mais ativo: P lol
Então o usuário pressiona o botão (evento onMouseDown) ... e depois disso, você verifica se está ativo (onMouseUp). Enquanto não estiver funcionando, você pode fazer o que precisa.
fonte
esta versão entre navegadores funciona bem para mim.
fonte