Introdução ao jQuery
2.5 Tratamento de eventos
</script>
Nesse exemplo, independente da sequência de cliques, a função toggle possui internamente um if que testa se o elemento "infoBox" está visível ou não. Caso o elemento esteja visível, a função toggle altera seu estado para oculto e, caso esteja invisível, altera seu estado para visível. Compare com o exemplo da função is() e veja como a programação fica muito mais enxuta.
2.5 Tratamento de eventos
Existem diversos tipos de eventos que ocorrem numa página web durante a interação do usuário. Por exemplo, quando o usuário move o mouse, clica sobre um elemento, seleciona um texto, digita um texto, seleciona uma opção, etc. O jQuery oferece um vasto arsenal de funções para lidar com esses eventos, possibilitando capturá-los para disparar rotinas de tratamento de eventos associados a uma ação desejada. Por exemplo, toda vez que o usuário passa o mouse sobre uma imagem, essa mesma poderia ser aumentada para facilitar a visualização de seus detalhes. Esse é um exemplo que envolve a programação de algumas etapas, tais como: associar o evento do "mouse sobre" a aquela imagem específica; monitorar quando esse evento é disparado; tomar uma ação para realizar o resultado desejado. Todas essas etapas são realizadas com o tratamento de eventos que o jQuery oferece em sua API.
Evento click
Talvez um dos eventos mais comuns. Ocorre quando o usuário efetua um clique do mouse sobre algum elemento. Vejamos um exemplo de como associar um evento de click a um botão HTML:
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8"/>
<script src="jquery.js"></script>
<style></style>
<script>
$(document).ready(function(){
$("#botao").click(function(){
alert("O botão foi clicado");
});
});
</script>
</head>
<body>
<button id="botao">Clique aqui!</button>
</body>
</html>
Quando o usuário clicar no botão, o evento click já estará sendo monitorado pelo jQuery. Além disso, associamos uma função anônima, passada como parâmetro para a função click, que será executada. É nesse ponto que colocamos a ação que pretendemos realizar quando tal evento ocorrer. Por exemplo, vamos supor que toda vez que o click é realizado, a função toggleClass é chamada para adicionar ou remover a classe black na tag body:
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8"/>
<script src="jquery.js"></script>
<style>
.black{
background-color: #000;
color: #fff;
}
</style>
<script>
$(document).ready(function(){
$("#botao").click(function(){
$("body").toggleClass("black");
});
});
</script>
</head>
<body>
<button id="botao">Clique aqui!</button> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua.</p>
</body>
</html>
Evento mouseover
Ocorre quando o usuário passa o cursor do mouse sobre determinado elemento. Veja o exemplo a seguir, que modifica a cor de fundo de uma div com id #texto toda vez que o mouse passa sobre a mesma:
<script>
$(document).ready(function(){
$("#texto").mouseover(function(){
$(this).css("background-color","red");
});
});
</script>
Observe o uso do this. É comum o seu uso quando se trabalha com eventos, pois geralmente quando capturamos um evento sobre um determinado elemento, o próprio elemento é o alvo da ação que se realizará logo a seguir. Portanto, nesse caso o this se refere ao elemento #texto, que é a div.
Evento change
Este evento pode ser bastante útil para capturarmos quando o estado de um elemento é alterado. Considere que precisamos alterar o src de uma imagem de acordo com a opção selecionada em um select. Usando o evento change fica fácil fazer isso:
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8"/>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
$("#foto").hide();
$("#modelos").change(function(){
$("#foto").attr("src",$(this).val());
$("#foto").show();
});
});
</script>
</head>
<body>
Selecione o modelo de carro:
<select id="modelos">
<option></option>
<option value="palio.png">Palio</option> <option value="corsa.png">Corsa</option> <option value="gol.png">Gol</option>
</select>
<img src="" id="foto"/>
</body>
</html>
Nesse exemplo, a função change só é disparada quando o select tem seu valor modificado. Assim, basta usar a função attr() para modificar o atributo src da imagem.
Evento keypress
O evento keypress pertence à outra categoria de eventos associados a ações que o usuário realiza através do uso do teclado. A função keypress permite monitorar quando uma tecla é pressionada e assim realizar algum tipo de ação. Considere o código a seguir:
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8"/>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
$("#nome").keypress(function(evento){
$("#exibe").append("Código ascii da tecla digitada: " +
evento.keyCode + "<br>");
});
});
</script>
</head>
<body>
Digite seu nome: <input type="text" id="nome"/>
<div id="exibe">
</div>
</body>
</html>
Nesse exemplo é associado um tratador de eventos do tipo "tecla pressionada" ao input #nome. Assim, toda vez que a tecla é pressionada esse tratador é chamado. Nesse caso, a função de tratamento recebe como parâmetro um objeto chamado "evento" que possui informações sobre o evento da tecla pressionada. Com isso é possível saber exatamente qual foi a tecla pressionada através do atributo keyCode. Sabendo disso podemos realizar alguma lógica de decisão como, por exemplo, verificar a tecla digitada pelo usuário e alterar a propriedade CSS da tag body:
<script>
$(document).ready(function(){
$("#nome").keypress(function(evento){
console.log(evento.keyCode);
// se usuário digita "a" muda cor para azul
if(evento.keyCode == 97){
$("body").css("background-color","blue");
}
// se digita "r" muda cor para vermelho
else if(evento.keyCode == 114){
$("body").css("background-color","red");
}
});
});
</script>
Evitando o envio do formulário
Toda vez que um usuário pressiona a tecla enter em um campo dentro de um formulário, a ação padrão do navegador web é enviar o formulário para o servidor. Essa ação pode ser indesejável, principalmente quando o usuário comete o erro de teclar enter antes mesmo de completar o preenchimento do formulário. A fim de evitar tal situação, o jQuery oferece uma função que previne o envio do formulário, deixando que o controle de envio do mesmo fique na mão do programador, por exemplo:
<script>
$(document).ready(function(){
$("#formulario input[type='text']").keypress(
function(evento){
// se usuário pressionou tecla enter
if(evento.keyCode == 13){
// anulando o envio do formulário:
evento.preventDefault();
}
});
});
</script>
Com a função preventDefault() cancelamos o evento de submissão do formulário. Essa mesma lógica pode ser utilizada para realizar validações no formulário e impedir que o mesmo seja enviado caso existam campos com valores inválidos.
Função on()
Outra forma de associar um tratador de eventos a um elemento é através da função on(). De fato, essa função é a forma mais recomendada para se adicionar eventos a um elemento. No exemplo a seguir temos uma input com o tratamento de eventos do tipo keyup. Toda vez que uma tecla é liberada, o conteúdo da inputé copiado para a div #exibe :
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8"/>
<script src="jquery.js"></script>
<style>
input{width: 80%; color: green;}
#exibe{
border: 1px solid #CCC;
padding: 20px; margin: 20px;
}
</style>
<script>
$(document).ready(function(){
$("#nome").on("keyup",function(e){
$("#exibe").text($(this).val());
});
});
</script>
</head>
<body>
Digite algo: <input type="text" id="nome"/>
<div id="exibe">
</div>
</body>
</html>
Algumas vezes trabalhamos com a criação dinâmica de elementos. Nesse caso, como os elementos são criados depois do código jQuery ter sido executado, a função on() não consegue associar eventos a estes novos elementos. Sendo assim, temos que fazer a delegação de eventos. Observe o código abaixo. Primeiro, declaramos a região de seleção da função on(), neste caso, o elemento body. Quando um keyup é acionado no elemento cuja classe é "fieldName", executamos a função anônima. Deste modo, podemos criar quantos campos "fieldName" quisermos, que automaticamente teremos um tratamento de evento associado a este elemento recém criado:
<script>
$(document).ready(function(){
$("body").on("keyup",".fieldName",function(e){
$("#exibe").text($(this).val());
});
});
</script>
Função off()
Esta função possui o efeito contrário à função on(). Ela permite desassociar um evento de um elemento. No exemplo abaixo, o elemento #nome terá cancelado todos os eventos a ele associados.
<script>
$(document).ready(function(){
$("#desliga").click(function(){
$("#nome").off();
});
});
</script>
Caso queira cancelar apenas um tipo de evento, deverá especificar qual o evento, passando como parâmetro para a função off:
$("#nome").off("click");
Função trigger()
Esta função permite disparar de modo manual um evento. No código abaixo, a input "#changeBody", quando clicada, altera a formatação da body. Observe que, na última linha da função ready, disparamos um clique usando a função trigger, tendo como alvo o checkbox. Com isso, quando a página for carregada automaticamente, o checkbox aparecerá marcado:
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8"/>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
$("#changeBody").click(function(){
$("body").css({
"background-color":"black",
"color":"white"
});
});
$("#changeBody").trigger("click");
});
</script>
</head>
<body>
<input type="checkbox" id="changeBody"/>
Clique aqui para alterar a body
</body>
</html>
Lista de eventos
A tabela a seguir apresenta uma lista resumida de eventos separados por tipos de eventos: (1) eventos de mouse; (2) eventos de teclado e (3) eventos do browser. Todos esses eventos podem ser mapeados no jQuery e realizado o devido tratamento.
FUNÇÃO DESCRIÇÃO
Eventos de mouse
.change() este evento ocorre toda vez que o valor do elemento é
alterado
.click() ocorre quando um click do mouse é detectado num
elemento
.dbclick() evento de clique duplo sobre um elemento
.focus() ocorre quando um elemento recebe o foco
.hover() ocorre quando o mouse passa sobre um elemento
.mousedown() evento disparado quando o botão do mouse é apertado .mousemove() evento é acionado toda vez que o mouse se movimento
dentro de um elemento
.mouseout() evento é acionado toda vez que o mouse sai de cima de
um elemento
.mouseover() evento é acionado toda vez que o mouse passa sobre o
elemento
.mouseup() evento é acionado toda vez que o botão do mouse é
clicado e liberado
Eventos de teclado
.keydown() evento acionado quando uma tecla é apertada
.keyup() evento acionado quando uma tecla é liberada
.keypress() evento acionado quando uma tecla é pressionada Eventos do browser
.ready() evento acionado indicando que todo o código HTML
foi lido e a árvore DOM está pronta
.resize() evento acionado quando o tamanho da janela do
browser é alterada
Função bind() e unbind()
A função bind() permite associar um "ouvinte" de eventos a um elemento. Por exemplo, no código abaixo definimos um botão "Esconder" que, quando clicado, oculta todas as imagens da página. Para mapear o click, que é o gatilho dessa ação, usamos a função bind, passando dois parâmetros: o nome do evento e uma função anônima que contém a lógica para esconder as imagens: