# Dê aos listeners um responsável e um ciclo de vida definidos

> Interrompa entradas e retornos de chamada repetidos, fornecendo aos ouvintes de eventos de cada cena um proprietário claro, um limite de configuração e um caminho de desmontagem.

- URL: https://oneshotgems.ai/pt-BR/topics/preventing-game-event-listener-duplicates
- Categoria: Para desenvolvedores de jogos
- Tipo: Guia
- Atualizado: 5 de outubro de 2026

Se um clique for disparado duas vezes após a reinicialização, um ouvinte poderá ser registrado sempre que a cena for aberta e nunca removido. Esse sintoma visível de ação duplicada é diferente de uma ampla investigação de vazamento de memória: comece contando os registros e vinculando-os ao ciclo de vida da cena. Cada ouvinte deve ter um proprietário claro, um ponto de configuração que seja executado uma vez para esse proprietário e um caminho de desmontagem quando a cena parar de aceitar entrada.

## Registre-se em um limite deliberado do ciclo de vida

Evite anexar um manipulador de keydown de janela de uma função de renderização ou de cada quadro. Coloque a configuração específica da cena em uma função de inicialização ou montagem e certifique-se de que a função não possa ser executada duas vezes sem limpeza. Mantenha uma referência ao retorno de chamada ao usar removeEventListener; retornos de chamada anônimos criados repetidamente são difíceis de corresponder posteriormente. Como alternativa, forneça um AbortController a um grupo de manipuladores relacionados e passe seu sinal nas opções do ouvinte e, em seguida, aborte esse grupo quando a cena terminar.

Escolha os alvos do evento com cuidado. Um ouvinte de janela global pode ser apropriado para teclas enquanto um jogo está ativo, mas o manipulador de cliques de um botão pertence a esse botão. Não registre um manipulador de delegação pai e um manipulador direto para a mesma ação, a menos que a propagação de eventos faça parte intencionalmente do design.

## Teste a entrada repetida de cenas como uma verificação de sintomas

Abra uma cena, pressione sua ação uma vez, saia e abra-a novamente. Uma entrada ainda deve causar um efeito. Repita o ciclo cinco vezes e verifique se a contagem de respostas permanece uma por pressionamento; esta é uma verificação funcional, não uma medição de memória. Confirme também se a entrada da cena antiga não muda mais sua pontuação ou estado após a saída. O MDN documenta o suporte do AbortSignal para agrupar ouvintes e observa que funções anônimas precisam de referências retidas para remoção explícita.

## Mantenha a desmontagem alinhada com a propriedade

Quando uma cena é substituída, aborte ou remova seus ouvintes antes de descartar os objetos aos quais eles fazem referência. Se alguns ouvintes pertencerem a todo o shell do aplicativo, mantenha-os em um proprietário de vida mais longa, em vez de removê-los a cada rodada. Adicione um caso de regressão em torno dos fluxos de reinicialização, pausa e retorno ao menu, pois cada transição pode acidentalmente montar a mesma cena duas vezes ou pular sua limpeza.

## Perguntas

**Por que pressionar uma tecla produz múltiplas ações de jogo?** A mesma ação pode ter vários manipuladores registrados, ou tanto um ancestral quanto um filho podem processar o evento. Conte registros e inspecione a propagação de eventos no limite do ciclo de vida da cena.

**O AbortController pode remover ouvintes de eventos?** Sim. Adicione ouvintes relacionados com o mesmo sinal e aborte o grupo quando seu proprietário terminar. Isso dá ao grupo um caminho de desmontagem claro; isso não substitui a decisão de qual proprietário os controla.

## Siga sua curiosidade

- [Rastreie vazamentos de memória em um jogo de navegador](https://oneshotgems.ai/pt-BR/topics/game-memory-leaks): Use verificações repetíveis de reprodução e limpeza para encontrar cenas de jogo, ouvintes, cronômetros e ativos retidos que se acumulam ao longo do tempo.
- [Gerencie o foco em jogos de navegador](https://oneshotgems.ai/pt-BR/topics/game-focus-management): Torne a entrada do teclado, os menus e os caminhos de retorno previsíveis, dando ao jogo um estado de foco visível e restaurando o foco após o fechamento das sobreposições.

## Leitura complementar

- [MDN addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)

---
Página canônica: https://oneshotgems.ai/pt-BR/topics/preventing-game-event-listener-duplicates
