Capítulo 30
Revisão e entrega local
2 min de leitura 419 palavras 1 gravura
Checklist final. Confirme teclado, JSON local e o que não publicar. Conteúdo fictício.
Trabalhe sobre uma cópia da pasta inicio do exemplo correspondente. Leia, digite, mude uma coisa, preveja o resultado, recarregue e confira. A referência completa fica na raiz da pasta do exemplo, no pacote anexo.
O que você pratica
- Explique o papel central desta etapa no exemplo
30-revisao. - Implemente a versão inicio e descreva uma mudança que você testou.
- Qual erro comum deste capítulo você conseguiu provocar de propósito?

Checklist
Monte checkboxes a partir de um array. Some quantos estão marcados.
Conferência mínima
Etapas 01–27 no navegador; 28–29 em 127.0.0.1; formulário sem envio; teclado nos botões.
O que não publicar
Não suba exercícios com dados pessoais. A pasta .trabalho não entra no zip. Estude na ordem numérica.
Ler o exemplo completo
A referência desta etapa usa app.js, index.html, styles.css. Abra primeiro o resultado pronto e identifique onde acontece checklist. Depois compare o mesmo ponto com a pasta inicio. Essa comparação mostra exatamente o que você precisa escrever, sem esconder partes indispensáveis do programa.
Diagnóstico guiado
Se o resultado não aparecer, confirme o arquivo aberto, salve a alteração e recarregue. Em seguida, abra o Console: leia a primeira mensagem de erro, confira o nome do arquivo e a linha indicada. Quando houver fetch, sirva a pasta apenas em 127.0.0.1; abrir por file:// não reproduz o pedido HTTP.
Critério de avanço
Avance quando conseguir explicar o papel de inicio, realizar uma mudança pequena e restaurar o exemplo sem copiar a resposta comentada.
Atividades
- Na referência, onde aparece checklist e qual efeito você observa?
- Na cópia
inicio, mude apenasinicio. O que você prevê antes de executar novamente? - Provoque uma falha pequena nesta etapa. Qual mensagem ou comportamento ajudou você a encontrar a causa?
Respostas comentadas
Só abra depois de tentar.
Atividade 1. A resposta deve apontar o arquivo e ligar o trecho ao efeito visível. Compare com app.js, index.html, styles.css.
Atividade 2. Registre o valor anterior, o novo valor e o resultado previsto. Depois confira; se houver diferença, explique o que o programa realmente fez.
Atividade 3. Uma boa investigação começa pela primeira mensagem do Console, pelo arquivo salvo e pelo caminho aberto. Corrija uma causa por vez e execute de novo.
Exemplo deste capítulo: pacote de exemplos/30-revisao/.
O arquivo completo
Referência do exemplo 30-revisao, reproduzida aqui para que você possa conferir sem sair da página.
index.html
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Revisão e entrega local — Ateliê do Marco Zero</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<a class="skip" href="#conteudo">Ir para o conteúdo</a>
<header>
<p class="tag">Ateliê do Marco Zero · Recife</p>
<h1>Revisão e entrega local</h1>
</header>
<main id="conteudo">
<p>Checklist final do Ateliê do Marco Zero. Marque o que já confere nesta máquina.</p>
<ul class="lista" id="lista"></ul>
<p id="resumo" class="painel" aria-live="polite"></p>
</main>
<footer>
<p>Material de estudo. Conteúdo fictício. Servidor só em 127.0.0.1.</p>
</footer>
<script src="app.js"></script>
</body>
</html>
app.js
const itens = [
"Exemplos abrem no navegador",
"Console sem erro vermelho nas etapas 01–27",
"Etapas 28–29 testadas em 127.0.0.1",
"Formulário não envia dados reais",
"Teclado alcança botões principais",
];
const lista = document.querySelector("#lista");
const resumo = document.querySelector("#resumo");
const estado = itens.map(() => false);
itens.forEach((texto, i) => {
const li = document.createElement("li");
const id = `c${i}`;
li.innerHTML = `<label><input type="checkbox" id="${id}"> ${texto}</label>`;
lista.appendChild(li);
li.querySelector("input").addEventListener("change", (e) => {
estado[i] = e.target.checked;
const ok = estado.filter(Boolean).length;
resumo.textContent = `${ok} de ${itens.length} conferidos.`;
});
});
resumo.textContent = `0 de ${itens.length} conferidos.`;