📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 05: JavaScript Fundamentos e DOM. Recomendado revisar antes de começar.
📁 Código deste projeto:
web-vanilla/(os caminhos citados abaixo são relativos à subpasta).
v1.0 — JavaScript Moderno ES6+, DOM API, Event Delegation e LocalStorage
Trilha de Especialização Pedagógica — Projeto 1 de 4
- ➡️ v1 (este): JavaScript Moderno · DOM API · Event Delegation · Web Storage
- v2: Consumo Assíncrono com Fetch API & Promises
- v3: Single Page Application (SPA) com Roteador por Histórico
- v4: Mini-Framework Reativo com Proxies & Virtual DOM
🎓 Nível Profissional Simulado: Desenvolvedor JavaScript Júnior. Antes de aprender React, Vue ou Angular, você precisa dominar o JavaScript do navegador. Saber como o DOM funciona, como eventos propagam via Bubbling e como o Event Loop opera é o divisor de águas entre quem apenas copia código e quem cria soluções de alta performance.
Construir uma aplicação interativa de Gerenciamento de Tarefas e Eventos utilizando exclusivamente JavaScript Moderno (ES6+) Puro, implementando o padrão de Event Delegation para manipulação atômica de nós, validação em tempo real e persistência local com Web Storage API.
“Queremos um organizador pessoal que funcione direto no navegador, sem precisar logar ou ter backend. O usuário pode adicionar tarefas, marcar como concluídas, filtrar por status (Todas, Pendentes, Concluídas) e excluir itens. Se fechar o navegador e voltar amanhã, os dados têm que continuar lá. E o sistema precisa ser leve e responder na hora sem travar a tela.”
| ID | Tipo | Descrição | Origem no Briefing |
|---|---|---|---|
| RF01 | Funcional | Permitir criar tarefas com título, data e identificador único atômico. | “adicionar tarefas” |
| RF02 | Funcional | Alternar status de conclusão e excluir tarefas dinamicamente. | “marcar como concluídas, excluir” |
| RF03 | Funcional | Persistir a lista completa no localStorage a cada alteração de estado. |
“dados têm que continuar lá” |
| RF04 | Funcional | Filtrar visualização por Todas / Pendentes / Concluídas. | “filtrar por status” |
| RNF01 | Não-Funcional | Manipulação de eventos via Event Delegation no container principal. | Performance de DOM |
| RNF02 | Não-Funcional | 100% JavaScript Vanilla sem frameworks. | Arquitetura Leve |
| ID | User Story | Prioridade |
|---|---|---|
| US01 | Como usuário, quero cadastrar uma tarefa e vê-la renderizada instantaneamente. | Alta |
| US02 | Como usuário, quero recarregar a página sem perder minhas tarefas cadastradas. | Alta |
# Branch da funcionalidade
git checkout -b feature/US01-event-delegation-dom
# Abrir a aplicação
open index.html
src/app.js)class TaskManager {
constructor(containerId) {
this.container = document.getElementById(containerId);
this.storageKey = 'portal_js_tasks';
this.tasks = JSON.parse(localStorage.getItem(this.storageKey) || '[]');
this.init();
}
init() {
this.render();
// Event Delegation: um único listener para múltiplos elementos
this.container.addEventListener('click', (e) => {
const btn = e.target.closest('[data-action]');
if (!btn) return;
const id = btn.closest('[data-id]')?.dataset.id;
if (btn.dataset.action === 'delete') this.removeTask(id);
if (btn.dataset.action === 'toggle') this.toggleTask(id);
});
}
}
<div id="todo-app">
<form id="todo-form">
<input type="text" id="todo-input" placeholder="Nova tarefa...">
<button type="submit">Adicionar</button>
</form>
<ul id="todo-list"></ul>
</div>
<script src="web-vanilla/app.js"></script>
const app = new TaskManager('todo-app');
- Inserção, exclusão e alteração de estado funcionam sem recarregar a página.
- Persistência automática no
localStorage.
| ⬅️ Ver Todos os Projetos no Catálogo de Projetos | 🏠 Página Inicial do Portal |