Passando Dados para o Manipulador de Eventos: Objeto Event - JavaScript
Às vezes é necessário passar dados para um manipulador de eventos. Se os manipuladores de eventos forem configurados usando atributos de elementos, isso pode ser feito de maneira bastante simples. Por exemplo, vamos passar um texto para o manipulador de cliques de um botão que será usado no manipulador:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<button id="btn" onclick="btnClick('Button Clicked')">Clique em mim</button>
<script>
// o texto é passado para o manipulador
function btnClick(text) {
console.log(text); // exibimos esse texto
}
</script>
</body>
</html>
Assim, no manipulador do botão, um certo texto é passado:
<button id="btn" onclick="btnClick('Button Clicked')"></button>
Na função do manipulador, obtemos esse texto e o usamos de alguma forma, por exemplo, exibindo-o no console:
function btnClick(text) {
console.log(text); // exibimos esse texto
}
Neste caso, uma string foi passada para a função do manipulador, mas na realidade, pode ser qualquer objeto. Por exemplo, usando o valor this
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<button id="btn" onclick="btnClick(this)">Clique em mim</button>
<script>
let clicks = 0; // contador de cliques
// uma referência ao elemento do botão é passada para o manipulador
function btnClick(btn) {
// alteramos o texto do botão
btn.textContent = `Clicado ${++clicks}`;
}
</script>
</body>
</html>
A palavra-chave this
textContent
Vale destacar que em alguns casos, pode ser necessário retornar false do manipulador. Por exemplo, considere o seguinte programa:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<a id="link" href="https://www.programicio.com" onclick="return aClick(this)">Programício</a>
<script>
// uma referência é passada para o manipulador
function aClick(anchor) {
// obtemos o endereço da âncora
console.log(anchor.href);
return false; // proibimos a redireção
}
</script>
</body>
</html>
Aqui no atributo onclick do elemento de link <a>
<a id="link" href="https://www.programicio.com" onclick="return aClick(this)">
Enquanto isso, a função do manipulador retorna false
function aClick(anchor) {
console.log(anchor.href);
return false; // proibimos a redireção
}
O fato é que para alguns manipuladores, podemos confirmar ou interromper o processamento do evento. Por exemplo, clicar em um link normalmente levaria à redireção. No entanto, ao retornar false
true
Objeto Event
Ao processar um evento, o navegador automaticamente passa para a função do manipulador um parâmetro chamado objeto Event
: retornabubbles
se o evento for do tipo que se propaga para cima. Por exemplo, se o evento é disparado em um elemento filho, ele pode ser tratado no elemento pai.true
: retornacancelable
se é possível cancelar o processamento padrão do evento.true
: define o elemento ao qual o manipulador de evento está associado.currentTarget
: retornadefaultPrevented
se o métodotrue
foi chamado no objetopreventDefault()
.Event
: contém um número que representa a fase de processamento do evento. Os valores possíveis são:eventPhase
0 (Event.NONE)
1 (Event.CAPTURING_PHASE)
2 (Event.AT_TARGET)
3 (Event.BUBBLING_PHASE)
: aponta para o elemento em que o evento foi disparado.target
: armazena o momento em que o evento ocorreu.timeStamp
: indica o nome do evento.type
: indica se o evento foi gerado por elementos da página web ou por código JavaScript.isTrusted
Exemplo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<button onclick="btnClick(event)">Clique em mim</button>
<script>
function btnClick(e) {
console.log(e);
}
</script>
</body>
</html>
Quando a função manipuladora é chamada, as informações sobre o evento estão disponíveis através do objeto event
<button onclick="btnClick(event)">
No código JavaScript, esse objeto pode ser obtido através do parâmetro da função:
function btnClick(e) {
console.log(e);
}
Neste caso, simplesmente exibimos o objeto no console. Mas, naturalmente, também poderíamos obter informações específicas sobre o evento:
function btnClick(e) {
console.log("Type:", e.type); // Type: click
console.log("Target:", e.target); // Target: <button onclick="btnClick(event)">Clique em mim</button>
console.log("Timestamp:", e.timeStamp);
}
Da mesma forma, podemos obter o objeto evento se o manipulador de eventos for anexado por meio das propriedades dos elementos ou pelo método addEventListener()
<button id="btn">Clique em mim</button>
<script>
function btnClick(e) {
console.log("Type:", e.type);
console.log("Target:", e.target);
console.log("Timestamp:", e.timeStamp);
}
// definimos o manipulador de clique para o elemento com id="btn"
document.getElementById("btn").onclick = btnClick;
</script>
Ou anexando o manipulador com o método addEventListener
<button id="btn">Clique em mim</button>
<script>
function btnClick(e) {
console.log("Type:", e.type);
console.log("Target:", e.target);
console.log("Timestamp:", e.timeStamp);
}
const btn = document.getElementById("btn");
// anexamos o manipulador de evento "click"
btn.addEventListener("click", btnClick);
</script>
Parando a Execução de um Evento
Com o método preventDefault()
Event
Por exemplo, vamos impedir a transição por um link:
<a id="link" href="https://www.programicio.com">Programício</a>
<script>
function linkHandler(e) {
console.log("Link has been clicked");
e.preventDefault(); // impedimos a transição pelo link
}
const link = document.getElementById("link");
link.addEventListener("click", linkHandler);
</script>
Aqui, ao clicar no link, o método linkHandler
e.preventDefault()
Obtendo o Objeto Atual
Para obter o objeto atual para o qual o evento está sendo processado dentro do manipulador de eventos, podemos usar a palavra-chave this
<button id="btn">Clique em mim</button>
<script>
const btn = document.getElementById("btn");
function btnClick() {
console.log(this); // <button id="btn">Clique em mim</button>
}
btn.addEventListener("click", btnClick);
</script>
Aqui, ao processar o evento de clique no botão, o objeto this
btnClick
this
event.target
function btnClick(e) {
console.log(this === e.target); // true
}