Existe uma maneira de detectar se uma chave está atualmente inativa no JavaScript?
Eu sei sobre o evento "keydown", mas não é disso que preciso. Algum tempo APÓS a tecla ser pressionada, quero ser capaz de detectar se ela ainda está pressionada.
PS O maior problema parece ser que depois de algum tempo a tecla começa a se repetir, disparando eventos keydown e keyup como um demônio. Esperançosamente, há apenas uma função isKeyDown (tecla) simples, mas se não for esse o problema, será necessário superar / contornar.
javascript
input
keyboard
Daniel X Moore
fonte
fonte
Respostas:
Não. A única possibilidade é monitorar cada um
keyup
ekeydown
e lembrar.Não deveria. Você com certeza se repetirá
keypress
e, em muitos navegadores, também se repetirákeydown
, mas sekeyup
repetir, é um bug.Infelizmente, não é um bug completamente inédito: no Linux, Chromium e Firefox (quando está sendo executado em GTK +, que está em distros populares como o Ubuntu), ambos geram sequências repetidas de keyup-keypress-keydown para chaves retidas, que são impossíveis de distinguir de alguém martelando a chave muito rápido.
fonte
keyup
eventos correspondentes .Além de usar
keyup
ekeydown
ouvintes para rastrear quando uma tecla desce e sobe, na verdade existem algumas propriedades que informam se certas teclas estão pressionadas.Este estão disponíveis em todos os objetos de eventos do navegador gerado, tais como os de
keydown
,keyup
ekeypress
, para que você não tem que usar mousemove.Tentei gerar meus próprios objetos de evento com
document.createEvent('KeyboardEvent')
edocument.createEvent('KeyboardEvent')
e procurandoe.shiftKey
e tal, mas não tive sorte.Estou usando o Chrome 17 no Mac
fonte
Minha solução:
Agora posso verificar se alguma tecla foi pressionada em qualquer outra parte do script verificando
Se for verdade, a tecla está pressionada.
fonte
Não acredito que exista uma função isKeyDown, mas você pode escrever a sua própria.
Basicamente, crie um array cujo comprimento seja o número de chaves que você deseja monitorar. Em seguida, usando os eventos documentos / páginas / controles keyUp e keyDown, atualize o array com o estado dessa chave.
Em seguida, escreva uma função que verifique se uma determinada tecla está pressionada e retorne um bool.
Isso deve realizar o que você deseja.
fonte
Acabei aqui para verificar se já existia algo embutido no navegador, mas parece que não existe. Esta é a minha solução (muito semelhante à resposta de Robert):
Você pode então verificar se uma tecla foi pressionada com
is_key_down('ArrowLeft')
.fonte
Outras pessoas já fizeram esse tipo de pergunta antes (embora eu não veja nenhum tolo óbvio aqui agora).
Acho que a resposta é que o
keydown
evento (e seu gêmeokeyup
) são todas as informações que você obtém. A repetição está conectada com bastante firmeza ao sistema operacional, e um programa de aplicativo não tem muitas oportunidades de consultar o BIOS para o estado real da chave.O que você pode fazer, e talvez tenha que fazer se precisar fazer isso funcionar, é desfazer o salto da chave programaticamente. Essencialmente, você pode avaliar
keydown
ekeyup
você mesmo, mas ignorar umkeyup
evento se ele ocorrer muito rapidamente após o últimokeydown
... ou essencialmente, você deve atrasar sua resposta porkeyup
tempo suficiente para ter certeza de que não há outrokeydown
evento seguinte com algo como 0,25 segundo dokeyup
.Isso envolveria usar uma atividade de cronômetro e registrar as vezes em milissegundos para eventos anteriores. Não posso dizer que seja uma solução muito atraente, mas ...
fonte
fonte
O código a seguir é o que estou usando:
Quando o usuário mantém pressionada a tecla Alt por algum tempo (cerca de 2 segundos), um grupo de rótulos (classe = 'tecla oculta') aparece. Quando a tecla Alt é liberada, os rótulos desaparecem. jQuery e Bootstrap são usados.
fonte
Eu sei que esta é uma questão muito antiga, no entanto, há uma biblioteca JavaScript muito leve (~ .5Kb) que efetivamente "corrige" o disparo inconsistente de manipuladores de eventos de teclado ao usar a API DOM.
A biblioteca é Keydrown .
Aqui está o exemplo de código operativo que funcionou bem para meus objetivos, apenas alterando a chave na qual definir o ouvinte:
Eu incorporei o Keydrown em meu JavaScript do lado do cliente para uma animação de pausa adequada em um jogo Red Light Green Light que estou escrevendo. Você pode ver o jogo completo aqui . (Observação: se você estiver lendo isso no futuro, o jogo deve ter o código completo e ser jogável :-D!)
Eu espero que isso ajude.
fonte
Eu examinei as respostas acima e a abordagem
keydown
/ propostakeyup
funciona apenas em circunstâncias especiais. Se o usuário Alt-tab se distanciar ou usar um gesto de tecla para abrir uma nova janela ou guia do navegador, então umkeydown
será registrado, o que é bom, porque nesse ponto é impossível dizer se a tecla é algo que o aplicativo da web está monitorando ou é um navegador padrão ou atalho do sistema operacional. Voltando à página do navegador, ele ainda pensará que a chave está segura, embora tenha sido lançada nesse meio tempo. Ou alguma tecla é simplesmente mantida pressionada, enquanto o usuário muda para outra guia ou aplicativo com o mouse, e então solta fora de nossa página.As teclas modificadoras (
Shift
etc.) podem ser monitoradas viamousemove
etc., assumindo que há pelo menos uma interação do mouse esperada ao voltar a tabulação, o que é frequentemente o caso.Para a maioria todas as outras teclas (exceto modificadores,
Tab
,Delete
, mas incluindoSpace
,Enter
), monitoramentokeypress
iria trabalhar para a maioria das aplicações - uma tecla pressionada continuará a fogo. Porém, há alguma latência na redefinição da chave, devido à periodicidade dokeypress
disparo. Basicamente, sekeypress
não continuar disparando, é possível descartar a maioria das chaves. Isso, combinado com os modificadores, é bastante hermético, embora eu não tenha explorado o que fazer comTab
eBackspace
.Tenho certeza de que há alguma biblioteca por aí que resume essa fraqueza do DOM, ou talvez alguma mudança no padrão do DOM tenha cuidado disso, já que é uma questão bastante antiga.
fonte
Olhe para esta resposta e use
onkeyup
eonkeydown
. Aqui estão informações mais específicas sobre esses eventos.fonte
Isso funciona no Firefox e no Chrome.
Tive a necessidade de abrir localmente um arquivo html especial (pressionando
Enter
quando o arquivo é selecionado no explorador de arquivos do Windows), seja apenas para visualizar o arquivo ou para editá-lo em um editor online especial.Portanto, eu queria distinguir entre essas duas opções mantendo pressionada a
Ctrl
tecla -ou não, enquanto pressionavaEnter
.Como todos vocês compreenderam a partir de todas as respostas aqui, isso parece não ser realmente possível, mas aqui está uma maneira que imita esse comportamento de uma forma que era aceitável para mim.
A maneira como isso funciona é assim:
Se você mantiver pressionada a
Ctrl
tecla-ao abrir o arquivo, um evento keydown nunca será disparado no código javascript. Mas um evento keyup será acionado (quando você finalmente soltar aCtrl
tecla -key). O código captura isso.O código também desativa os eventos de tecla (keyup e keydown) assim que um deles ocorre. Portanto, se você pressionar a
Ctrl
tecla-após a abertura do arquivo, nada acontecerá.fonte
se você pressionar alt + enter, verá o alerta.
fonte