Isto é o que eu tenho agora:
$("input").bind("keydown",function(e){
var value = this.value + String.fromCharCode(e.keyCode);
}
Se a e.keyCode
não ser um caractere ASCII ( Alt, backspace, del, arrows, etc.) ... Eu agora precisa trim
destes valores devalue
de alguma forma (de preferência por meio de programação - não com tabelas de pesquisa).
Estou usando jQuery.
Eu devo usar o keydown
evento. keyPress
não ativa para determinadas chaves eu preciso de captura ( Esc, del, backspace, etc.).
Não consigo usar setTimeout
para obter o valor da entrada. setTimeout(function(){},0)
é muito lento.
javascript
jquery
special-characters
keycode
David Murdoch
fonte
fonte
keydown
para capturar códigos de caracteres? Você está em uma viagem infernal: quirksmode.org/js/keys.html (dica: usekeypress
!! )document.onkeydown = function(e){ console.log('Key: ' + e.key); }
Respostas:
Talvez eu não tenha entendido a pergunta corretamente, mas você não pode usá-
keyup
lo se quiser capturar as duas entradas?fonte
Na minha experiência
String.fromCharCode(e.keyCode)
não é confiável.String.fromCharCode
espera códigos de códigos unicode como argumento;e.keyCode
retorna códigos de chave javascript. Os códigos-chave Javascript e os códigos Unicode não são a mesma coisa! Em particular, as teclas do teclado numérico retornam um número diferentekeycode
das teclas numéricas comuns (já que são teclas diferentes), enquanto o mesmokeycode
é retornado para ambas as letrasupper
elowercase
letras (você pressionou a mesma tecla nos dois casos), apesar de terem teclas diferentes.charcodes
.Por exemplo, a tecla numérica comum 1 gera um evento com
keycode
49 enquanto a tecla numérica 1 (com ativado Numlock) gerakeycode
97. Usada comString.fromCharCode
, obtemos o seguinte:String.fromCharCode
espera códigos de código unicode, não códigos de chave javascript. A tecla agera um evento com umkeycode
de 65, independente do caso do caractere que geraria (também há um modificador para se a Shifttecla for pressionada, etc. no evento). O personagem atem um unicodecharcode
de 61 enquanto o personagem Atem umcharcode
de 41 (de acordo com, por exemplo, http://www.utf8-chartable.de/ ). No entanto, esses sãohex
valores, a conversão para decimal nos dá umacharcode
de 65 para "A" e 97 para "a". [1] Isso é consistente com o que obtemosString.fromCharCode
desses valores.Meu próprio requisito era limitado ao processamento de números e letras comuns (aceitar ou rejeitar, dependendo da posição na string) e permitir que caracteres de controle ( Fteclas, Ctrlalgo) passassem . Assim, posso verificar os caracteres de controle, se não for um caractere de controle, verifico em relação a um intervalo e só então preciso obter o caractere real. Como não estou preocupado com maiúsculas e minúsculas (mudo todas as letras para maiúsculas de qualquer maneira) e já limitei o intervalo de códigos de teclas, só preciso me preocupar com as teclas do teclado numérico. O seguinte é suficiente para isso:
Em geral, uma função para retornar o caractere de forma confiável
charcode
seria ótima (talvez como um plugin do jQuery), mas não tenho tempo para escrevê-lo agora. Desculpe.Eu também mencionaria
e.which
(se você estiver usando jQuery) que normalizae.keyCode
ee.charCode
, para que você não precise se preocupar com o tipo de tecla que foi pressionada. O problema de combiná-lo comString.fromCharCode
restos.[1] Fiquei confuso por um tempo -. todos os documentos dizem que
String.fromCharCode
espera um unicodecharcode
, enquanto, na prática, parecia funcionar para códigos ASCII, mas acho que devido à necessidade de converter em decimal de hexadecimal, combinado com o fato de que códigos de ASCII e códigos decimais unicode se sobrepõem a códigos comuns letras latinas.fonte
keyCode
é saber qual tecla foi pressionada, não saber qual caractere usar. Por exemplo, "U" em um teclado Dvorak tem o mesmo código de tecla que "F" em um teclado QWERTY ou "ㄹ" em um teclado coreano etc. O objetivo não é convertê-lo em um caractere, ele está lá para que você possa mapeie facilmente as coisas para a posição do teclado.Nomes de chave legíveis indexados por código de chave
Existem relativamente poucos de códigos de tecla de modo que simplesmente mencionadas, todos os valores correspondentes de uma matriz estático para poderia simplesmente converter o número
65
emA
usokeyboardMap[65]
Nem todos os códigos de chave são mapeados para um caractere imprimível; portanto, outra string identificável é retornada.
Pode ser necessário modificar a matriz para atender às suas necessidades e pode simplesmente retornar cadeias vazias para todos os caracteres que você não deseja traduzir. A matriz a seguir permite determinar de maneira rápida e confiável qual tecla foi pressionada em qualquer ambiente. Aproveitar!
Experimente o seguinte trecho de código usando esta abordagem de pesquisa de matriz estática ...
Mostrar snippet de código
Códigos-chave dignos de nota
Letras AZ: (65-90)
Dígitos 0-9: (48-57)
Teclado numérico 0-9: (96-105)
Teclas de seta: (37-40)
Tecla Tab: (9)
Tecla Enter: (13)
Tecla da barra de espaço: (32)
Chave específica do SO (91) Chave do Windows (Windows) ou Chave de comando (Mac)
Tecla Alt: (18)
Chave de controle: (17)
Tecla Shift: (16)
Tecla Caps Lock: (20)
fonte
Apenas uma observação importante: a resposta aceita acima não funcionará corretamente para keyCode> = 144, ou seja, ponto, vírgula, traço etc. Para aqueles que você deve usar um algoritmo mais geral:
Se você está curioso sobre o porquê, isso é aparentemente necessário devido ao comportamento da função JS interna
String.fromCharCode()
. Para valoreskeyCode <= 96
dele parece mapear usando a função:chrCode = keyCode - 48 * Math.floor(keyCode / 48)
Para valores
keyCode > 96
dele parece mapear usando a função:chrCode = keyCode
Se isso parece um comportamento estranho, então bem ... eu concordo. Infelizmente, isso seria muito longe da coisa mais estranha que eu já vi no núcleo do JS.
fonte
let
em uma resposta a uma pergunta de 2009. :-)let
, em seguida, eu fiz-lhes um favor ;-)Estou assumindo que isso é para um jogo ou para um tipo de aplicativo de resposta rápida, portanto, o uso de KEYDOWN que KEYPRESS.
Editar : Dang! Estou corrigido (obrigado Crescent Fresh e David): JQuery (ou melhor, os hosts DOM subjacentes) não expõem os detalhes do WM_KEYDOWN e de outros eventos. Em vez disso, eles pré-digerem esses dados e, no caso de keyDown, mesmo no JQuery, obtemos:
Observe que essas propriedades são os valores UniCode.
Observe que não consegui encontrar uma referência autoritativa a isso nos documentos do JQuery, mas muitos exemplos respeitáveis na rede se referem a essas duas propriedades.
O código a seguir, adaptado de algum java (não javascript) meu, está totalmente errado ...
A seguir, serão apresentadas as partes "interessantes" do código-chave:
fonte
keydown
ou não).Sei que essa é uma pergunta antiga, mas hoje me deparei com ela procurando uma solução pré-empacotada para esse problema e não encontrei nada que realmente atendesse às minhas necessidades.
Aqui está uma solução (somente em inglês) que suporta corretamente letras maiúsculas (deslocadas), letras minúsculas, pontuação, teclado numérico etc.
Também permite a identificação simples e direta - e a reação a - teclas não imprimíveis, como ESC, Arrows, teclas de função, etc.
https://jsfiddle.net/5hhu896g/1/
Agradeço ao DaveAlger por me poupar algumas digitações - e muitas descobertas! - fornecendo a matriz de chaves nomeadas.
fonte
Eu escrevi recentemente um módulo chamado keysight que traduz
keypress
,keydown
ekeyup
eventos em personagens e chaves respectivamente.Exemplo:
fonte
Para aqueles que vieram aqui procurando os valores reais de caracteres Unicode para um código-chave, como eu fiz, aqui está uma função para isso. Por exemplo, dado o código de chave unicode da seta para a direita, isso produzirá a string visível
\u001B\u005B\u0043
fonte
Você também pode usar a propriedade somente leitura
key
. Também respeita teclas especiais comoshift etc. e é suportado pelo IE9.Quando um caractere não imprimível ou especial é pressionado, o valor estará ativado nos valores de tecla definidos como
'Shift'
ou'Multiply'
.event.key
'x'
'X'
'F5'
fonte
Consulte este link Obter código da tecla pressionada e valor do caractere para qualquer código de tecla
fonte