Eventos teclado jQuery

Como trabalhar com eventos de teclado em jQuery e saber que teclas os usuários pressionaram, através da propriedade which do objeto evento.

Por Miguel Angel Alvarez - Tradução de Celeste Veiga


Publicado em: 14/7/11
Valorize este artigo:
Estamos aprendendo sobre os eventos em jQuery e agora vamos fazer uma prática com os eventos de teclado, ou seja, com a definição de ações quando o usuário pressiona as teclas. A maneira de trabalhar com eventos de teclado não é muito diferente do já visto no manual de jQuery, porém com os eventos de teclado há algo que ainda não vimos e que resulta fundamental. É que , quando se produz o evento de teclado, no objeto evento de jQuery temos uma propriedade que serve para saber qual é a tecla pressionada, para fazer coisas em nossos scripts personalizadas em função da tecla pressionada pelo usuário.

Os eventos de teclado, em princípio, são três, como vimos no artigo Manipuladores de eventos em jQuery, keydown, keypress e keyup. Realmente não atuam por separado, senão que se produz uma combinação deles à medida que se vai pressionando e soltando as teclas, como pode ser deduzido das explicações do mencionado artigo.

Nota: Se pressionamos e soltamos uma tecla, primeiro se produz um evento keydown ao pressionar a tecla, em seguida um keypress e por último um keyup ao soltá-la.

Se pressionamos de modo prolongado uma tecla este esquema varia, pois se produz um keydown e em seguida um keypress. Enquanto se mantém apertada a tecla em loop se vão produzindo eventos keydown e keypress, repetidas vezes até que finalmente se solta a tecla e se produz um keyup.

No caso das teclas CTRL, Maiúsculas ou ALT, se produzem múltiplos keydown até que se solta a tecla e se produz um keyup. Ou seja, ao apertar uma destas teclas não se produz o evento keypress.

Sequência de eventos de teclado

Vamos aprender a sequência com que se produzem os eventos de teclado, com um pequeno exemplo prático.

Trata-se de fazer uma função que detecte qualquer evento de teclado, mostre o tipo de evento que ocorreu e o mostre na página. Assim poderemos ver os eventos que se produzem, sejam quais forem, e em que ordem.

Primeiro poderíamos definir a função que vai processar os eventos:

function operaEvento(evento){
$("#oescrito").html($("#oescrito").html() + evento.type + ": " + evento.which + ", ")
}

Esta função recebe o evento e escreve em uma camada o tipo de evento, que se obtém com a propriedade type do objeto evento, e em seguida um código da tecla pressionada, que se consegue com a propriedade which do objeto evento.

Nota: o tipo de evento ainda não havia sido visto ,mas é outra das propriedades que encontramos no objeto evento que recebe a função que tem o código a ser executado pelo evento. Esta propriedade type é simplesmente um string com a cadeia que identifica o tipo de evento que está sendo processado ("keydown", "keyup", "click" ou qualquer outro). A tecla pressionada, obtida com a propriedade which, vai ser tratada com detalhes dentro de pouco.

Agora podemos fazer que qualquer evento de teclado invoque esta função com o código:

$(document).keypress(operaEvento);
$(document).keydown(operaEvento);
$(document).keyup(operaEvento);

Como associamos os eventos ao objeto document de Javascript, estes eventos serão colocados em funcionamento cada vez que se pressione uma tecla, independentemente de onde esteja o foco da aplicação (ou onde o usuário esteja escrevendo).

Isto pode ser visto em funcionamento em uma página à parte.

Creio que vale a pena apresentar o código completo do exemplo anterior:

<html>
<head>
<title>Trabalhando com eventos de teclado em jQuery</title>
<script src="../jquery-1.4.1.min.js"></script>
<script>
function operaEvento(evento){
$("oescrito").html($("#oescrito").html() + evento.type + ": " + evento.which + ", ")
}
$(document).ready(function(){
$(document).keypress(operaEvento);
$(document).keydown(operaEvento);
$(document).keyup(operaEvento);
})
</script>

</head>
<body>
<h1>Eventos de teclado em jQuery</h1>
<div id="oescrito"></div>
</body>
</html>

Verificar que tecla foi pressionada

Através da propriedade which do objeto evento de jQuery podemos saber que tecla foi pressionada quando se produz o evento de teclado. Esta propriedade contém um número inteiro com o código Unicode da tecla pressionada. Faremos um exemplo para explicá-lo.

Temos um textarea e escrevendo algo nele, mostraremos a tecla pressionada em uma camada, independente do textarea. Este será o código HTML que necessitaremos para o exemplo:

<form>
<textarea cols=300 rows=2 id="meutexto">Escreva algo aqui!</textarea>
<br>
<b>Tecla pressionada:</b>
<br>
<div id="oescrito"></div>
</form>

Agora definiremos com jQuery o evento keypress, para mostrar a tecla pressionada.

$("#meutexto").keypress(function(e){
e.preventDefault();
$("#oescrito").html(e.which + ": " + String.fromCharCode(e.which));
});

Com e.preventDefault(); fazemos com que não se escreva nada no textarea, ou seja, estamos inibindo o comportamento habitual do evento, que é escrever as teclas no textarea, que não tem muito que ver com nosso exemplo, mas é bom para ver como funciona.

Depois escrevemos na camada com id "oescrito" o código de Unicode dessa tecla e em seguida sua conversão para um caractere normal, através da função estática da classe String fromCharCode().

O código completo do exercício é o seguinte.

<html>
<head>
<title>Trabalhando com eventos de teclado em jQuery</title>
<script src="../jquery-1.4.1.min.js"></script>
<script>
$(document).ready(function(){
$("#meutexto").keypress(function(e){
e.preventDefault();
$("#oescrito").html(e.which + ": " + String.fromCharCode(e.which))
});
})
</script>

</head>
<body>
<h1>Eventos de teclado em jQuery</h1>
<h2>Verificar que tecla está sendo pressionada</h2>
<form>
<textarea cols=300 rows=2 id="meutexto">Escreva algo aqui!</textarea>
<br>
<b>Tecla pressionada:</b>
<br>
<div id="oescrito"></div>
</form>
</body>
</html>

Podemos ver o exemplo em funcionamento em uma página à parte.






Usuários :    login / registro
Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato