pw1

Programacao Web I - Eventos em JavaScript

1. O que este guia ensina

Este README funciona como um guia de referencia sobre eventos no JavaScript. O objetivo e entender como o navegador detecta interacoes e como o codigo reage a elas para atualizar a interface.

Ao final desta leitura, voce deve conseguir:

2. O que sao eventos

Em JavaScript, um evento e um acontecimento detectado pelo navegador. Esse acontecimento pode ser provocado pelo usuario, pelo carregamento do documento ou por mudancas no proprio ambiente da pagina.

Exemplos comuns:

A programacao orientada a eventos existe para que o codigo seja executado no momento em que algo acontece, em vez de rodar sem motivo o tempo todo.

3. Estrutura mental de um evento

Quase todo uso de eventos segue este fluxo:

  1. selecionar o elemento que sera observado;
  2. escolher qual acontecimento sera escutado;
  3. definir a funcao que executara a resposta;
  4. registrar essa funcao com addEventListener().

Exemplo minimo:

const botao = document.querySelector('button');

function clicarNoBotao() {
    botao.textContent = 'Fui clicado';
}

botao.addEventListener('click', clicarNoBotao);

Neste exemplo:

4. addEventListener()

addEventListener() e a forma mais recomendada de associar eventos a elementos.

Sintaxe basica:

elemento.addEventListener('nomeDoEvento', funcao);

Exemplo com funcao nomeada:

const botao = document.querySelector('#btn-enviar');

function exibirMensagem() {
    console.log('Botao pressionado');
}

botao.addEventListener('click', exibirMensagem);

Exemplo com funcao anonima:

const botao = document.querySelector('#btn-enviar');

botao.addEventListener('click', function() {
    console.log('Botao pressionado');
});

Exemplo com arrow function:

const botao = document.querySelector('#btn-enviar');

botao.addEventListener('click', () => {
    console.log('Botao pressionado');
});

Quando usar cada forma

5. O objeto event

Quando um evento acontece, o navegador envia um objeto com informacoes sobre esse acontecimento. Esse objeto costuma ser chamado de event.

Exemplo:

const campo = document.querySelector('#nome');

campo.addEventListener('input', function(event) {
    console.log(event.target.value);
});

Algumas propriedades importantes:

Exemplo com teclado:

document.body.addEventListener('keydown', function(event) {
    console.log('Tecla pressionada:', event.key);
});

6. Principais categorias de eventos

Eventos de mouse

Sao eventos disparados por interacao com mouse, trackpad ou ponteiro.

Exemplo:

const caixa = document.querySelector('.caixa');

caixa.addEventListener('mouseenter', function() {
    caixa.classList.add('ativa');
});

caixa.addEventListener('mouseleave', function() {
    caixa.classList.remove('ativa');
});

Esse tipo de padrao aparece em efeitos visuais, menus e estados de destaque.

Eventos de teclado

Esses eventos dependem do foco do documento ou do elemento correto.

keypress existiu por muito tempo, mas hoje e considerado obsoleto para varios cenarios. Em exemplos novos, prefira keydown e keyup.

Exemplo:

document.body.addEventListener('keydown', function(event) {
    if (event.key === 'Enter') {
        console.log('O usuario pressionou Enter');
    }
});

Na pasta spaceship/, esse tipo de evento aparece no controle de movimento por teclado.

Eventos de formulario e entrada de dados

Sao comuns em input, textarea, select e form.

Comparacao importante:

Exemplo com input:

const campoNome = document.querySelector('#nome');
const saida = document.querySelector('#saida');

campoNome.addEventListener('input', function(event) {
    saida.textContent = event.target.value;
});

Exemplo com submit:

const formulario = document.querySelector('form');

formulario.addEventListener('submit', function(event) {
    event.preventDefault();
    console.log('Formulario interceptado pelo JavaScript');
});

Eventos de pagina e janela

Sao uteis para observar o estado geral do documento ou da janela.

Exemplo:

document.addEventListener('DOMContentLoaded', function() {
    console.log('O HTML foi carregado');
});

Comparacao importante:

7. target e currentTarget

Essa diferenca e central para entender a propagacao.

Exemplo conceitual:

<div id="card">
    <button id="botao">Clique</button>
</div>

Se o clique do botao for tratado pela div, o target sera o botao e o currentTarget sera a div.

Isso faz diferenca quando voce quer saber exatamente em que ponto da arvore o evento comecou e em que ponto ele esta sendo tratado.

8. Propagacao de eventos

Quando um evento acontece, ele pode percorrer a arvore do DOM.

No uso mais comum da disciplina, o comportamento mais observado e o bubbling, em que o evento sobe do elemento mais interno para os elementos externos.

Exemplo:

const card = document.querySelector('#card');
const botao = document.querySelector('#botao');

card.addEventListener('click', function() {
    console.log('Clique no card');
});

botao.addEventListener('click', function() {
    console.log('Clique no botao');
});

Ao clicar no botao, o clique pode atingir o botao e depois subir ate o card.

Para interromper essa subida:

botao.addEventListener('click', function(event) {
    event.stopPropagation();
});

Use isso com criterio. Interromper propagacao sem necessidade pode tornar o comportamento da interface mais dificil de entender.

9. preventDefault()

Alguns elementos possuem comportamentos padrao do navegador.

Exemplos:

Quando queremos impedir esse comportamento padrao, usamos event.preventDefault().

Exemplo:

const link = document.querySelector('a');

link.addEventListener('click', function(event) {
    event.preventDefault();
    console.log('A navegacao foi bloqueada');
});

Regra pratica:

10. Removendo eventos

Tambem e possivel remover um evento com removeEventListener().

Para isso, a funcao precisa existir como referencia reutilizavel.

const botao = document.querySelector('#btn-contador');

function exibirMensagem() {
    console.log('Clique detectado');
}

botao.addEventListener('click', exibirMensagem);
botao.removeEventListener('click', exibirMensagem);

Isso e util quando uma interacao precisa ser ativada so em certos momentos.

11. Eventos e alteracao visual

Muitas vezes um evento existe para alterar a interface.

Voce pode fazer isso diretamente com style:

const imagem = document.querySelector('img');

imagem.addEventListener('click', function() {
    imagem.style.width = '200px';
});

Mas, em geral, e mais organizado usar classes CSS:

const caixa = document.querySelector('.caixa');

caixa.addEventListener('click', function() {
    caixa.classList.toggle('ativa');
});

Essa abordagem separa melhor comportamento e apresentacao.

12. Relacao com os exemplos desta pasta

As subpastas desta secao ajudam a enxergar os eventos em contextos diferentes:

Esses tres cenarios mostram que evento nao e so “clicar em botao”. Ele e a base de praticamente toda interacao de interface.

13. Erros comuns de iniciantes

Registrar o evento no elemento errado

Se voce seleciona o elemento errado, o evento pode nunca disparar.

Esquecer o objeto event quando ele e necessario

Sem ele, voce nao consegue acessar propriedades como target, key ou chamar preventDefault().

Usar preventDefault() sem precisar

Isso pode bloquear comportamentos normais da interface sem motivo claro.

Confundir input com change

Eles parecem parecidos, mas disparam em momentos diferentes.

Usar stopPropagation() sem entender o fluxo

Isso pode quebrar interacoes de componentes maiores.

14. Boas praticas

15. Resumo final

Os pontos fundamentais sobre eventos sao:

Com esse repertorio, voce tera base suficiente para entender melhor DOM, formularios, validacoes e interfaces mais dinamicas.