Click, submit, input e delegação de eventos.
Clique do mouse
Envio de formulário
Digitação em campo
Tecla pressionada
Mouse sobre elemento
Valor alterado
const btn = document
.querySelector('#meuBtn');
btn.addEventListener('click', () => {
console.log('Clicou!');
});
// Inline no HTML (nao usar)
<button onclick="fn()">...</button>
// Propriedade on (limita a 1 listener)
btn.onclick = () => {
console.log('Clicou!');
};
// Se atribuir de novo, sobrescreve!
btn.onclick = () => {
console.log('Perdeu o anterior');
};
btn.addEventListener('click', (event) => {
console.log(event.type);
// "click"
console.log(event.target);
// o elemento clicado
console.log(event.target.textContent);
// texto do elemento
});
event.target
Elemento que disparou o evento
event.type
Tipo do evento (click, submit...)
event.key
Tecla pressionada (keydown)
event.preventDefault()
Cancela o comportamento padrão
event.currentTarget
Elemento que tem o listener
<button id="contador">Cliques: 0</button>
<button id="tema">Alternar tema</button>
// Contador de cliques
let cliques = 0;
const btnContador = document
.querySelector('#contador');
btnContador.addEventListener('click', () => {
cliques++;
btnContador.textContent =
`Cliques: ${cliques}`;
});
// Toggle de tema
const btnTema = document
.querySelector('#tema');
btnTema.addEventListener('click', () => {
document.body.classList
.toggle('dark');
});
querySelector
addEventListener
<input id="busca" placeholder="Buscar...">
<p id="resultado"></p>
<script>
const input = document.querySelector('#busca');
const resultado = document.querySelector('#resultado');
// Dispara a cada caractere digitado
input.addEventListener('input', (e) => {
resultado.textContent =
`Buscando: ${e.target.value}`;
});
</script>
Dispara a cada tecla digitada, em tempo real. Ideal para buscas, previews e validação instantânea.
Dispara quando o campo perde foco (blur) e o valor mudou. Ideal para selects e campos onde a confirmação importa.
Tecla pressionada / solta. Acesso a event.key para saber qual tecla.
<form id="formLogin">
<input id="email" type="email" required>
<input id="senha" type="password" required>
<button type="submit">Entrar</button>
</form>
<script>
const form = document
.querySelector('#formLogin');
form.addEventListener('submit', (e) => {
e.preventDefault();
// Impede recarregar a página
const email = document
.querySelector('#email').value;
const senha = document
.querySelector('#senha').value;
console.log(`Login: ${email}`);
});
</script>
Por padrão, o formulário recarrega a página ao ser enviado. Use e.preventDefault() para:
form, nunca no botão submit.
// A função precisa ter nome
function handleClick() {
console.log('Clicou!');
}
// Adicionar
btn.addEventListener(
'click', handleClick
);
// Remover
btn.removeEventListener(
'click', handleClick
);
// Executa apenas UMA vez
btn.addEventListener('click', () => {
console.log('Só uma vez!');
}, { once: true });
{ once: true } remove automaticamente o listener após a primeira
execução.
<ul id="lista">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<script>
// Listener no PAI, nao nos filhos
const lista = document.querySelector('#lista');
lista.addEventListener('click', (e) => {
// Verificar se clicou num <li>
if (e.target.tagName === 'LI') {
e.target.classList
.toggle('feito');
}
});
</script>
Como funciona:
Os eventos "sobem" (bubbling) do elemento clicado até o document. Ao ouvir
no pai, usamos event.target para saber qual filho foi clicado.
<li> na lista
preventDefault() para impedir o reload da página<ul> para que ao clicar em uma tarefa ela
fique riscadainput que filtra as tarefas em tempo
reallocalStorage para que persistam ao recarregar.
Fetch API: consumo de APIs externas e async/await.