You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.6 KiB
5.6 KiB
19 - Todo List Aplikace
🎯 Co se naučíte
V této lekci se naučíte vytvořit kompletní Todo List aplikaci s přidáváním, odebíráním a označováním úkolů.
📚 Témata lekce
- Todo List aplikace - praktický projekt
- Dynamické přidávání položek do seznamu
- Odstranění položek z DOM
- Toggle stavu - splněno/nesplněno
- Local Storage - ukládání dat v prohlížeči (možná)
- Event delegation - efektivní event handling
- Bootstrap styling pro moderní UI
- Textarea - víceřádkový vstup
📂 Soubory v projektu
index.html- HTML s formulářem a seznamemtodo.js- JavaScript pro funkcionalitucss/bootstrap.css- Bootstrap CSS
💻 Ukázka z lekce
HTML struktura:
<textarea class="form-control velkytext" id="todoitem"
placeholder="Zde napiš úkol"></textarea>
<button class="btn btn-primary w-100 my-3" onclick="additem()">
ZAPSAT
</button>
<ul id="todoList"></ul>
JavaScript - Přidání úkolu:
function additem() {
const todoitem = document.getElementById("todoitem").value;
if (todoitem === "") {
alert("Zadej úkol!");
return;
}
const todoList = document.getElementById("todoList");
// Vytvoření <li> elementu
const li = document.createElement("li");
li.className = "todolistitem";
li.innerHTML = `
${todoitem}
<button class="btn btn-danger btn-sm ms-2"
onclick="removeitem(this)">Smazat</button>
<button class="btn btn-success btn-sm ms-1"
onclick="toggleitem(this)">Hotovo</button>
`;
todoList.appendChild(li);
// Vyčištění textarea
document.getElementById("todoitem").value = "";
}
// Odstranění úkolu
function removeitem(button) {
const li = button.parentElement;
li.remove();
}
// Toggle splněno/nesplněno
function toggleitem(button) {
const li = button.parentElement;
li.classList.toggle("text-decoration-line-through");
li.classList.toggle("text-muted");
}
🚀 Jak s lekcí pracovat
- Otevřete
index.htmlv prohlížeči - Napište úkol do textarey
- Klikněte na "ZAPSAT" - úkol se přidá do seznamu
- Vyzkoušejte tlačítko "Hotovo" - přeškrtne úkol
- Klikněte na "Smazat" - odstraní úkol ze seznamu
- Přidejte více úkolů a vyzkoušejte všechny funkce
- Prozkoumejte
todo.js- jak funguje logika
💡 Tip pro studenty
parentElement:
function removeitem(button) {
// button = <button> element
// button.parentElement = <li> element (rodič)
const li = button.parentElement;
li.remove();
}
classList.toggle():
// Toggle třídy (přidá/odebere)
element.classList.toggle("active");
// Přidá třídu
element.classList.add("active");
// Odebere třídu
element.classList.remove("active");
// Zkontroluje, zda má třídu
element.classList.contains("active"); // true/false
text-decoration-line-through:
<!-- Přeškrtnutý text -->
<p class="text-decoration-line-through">Dokončeno</p>
Validace vstupu:
if (todoitem === "" || todoitem.trim() === "") {
alert("Zadej úkol!");
return; // Ukončí funkci
}
🎯 Rozšíření projektu
1. Local Storage (ukládání dat):
// Uložení do local storage
function saveTodos() {
const todos = [];
document.querySelectorAll("#todoList li").forEach(li => {
todos.push(li.textContent);
});
localStorage.setItem("todos", JSON.stringify(todos));
}
// Načtení z local storage
function loadTodos() {
const todos = JSON.parse(localStorage.getItem("todos")) || [];
todos.forEach(todo => {
// Přidat do seznamu
});
}
// Volat při načtení stránky
window.onload = loadTodos;
2. Počítadlo úkolů:
<p>Celkem úkolů: <span id="totalCount">0</span></p>
<p>Dokončeno: <span id="completedCount">0</span></p>
function updateCounters() {
const total = document.querySelectorAll("#todoList li").length;
const completed = document.querySelectorAll("#todoList li.text-decoration-line-through").length;
document.getElementById("totalCount").textContent = total;
document.getElementById("completedCount").textContent = completed;
}
3. Priorita úkolů:
<select id="priority" class="form-select">
<option value="low">Nízká</option>
<option value="medium">Střední</option>
<option value="high">Vysoká</option>
</select>
// Barevné označení podle priority
if (priority === "high") {
li.classList.add("border-start", "border-danger", "border-5");
}
4. Editace úkolů:
function edititem(button) {
const li = button.parentElement;
const newText = prompt("Upravit úkol:", li.firstChild.textContent);
if (newText) {
// Aktualizovat text úkolu
}
}
⚠️ Důležité poznámky
- Validace vstupu - kontrolujte prázdné hodnoty
- trim() - odstraní mezery na začátku a konci
- this v onclick - odkazuje na button element
- remove() - moderní způsob odstranění elementu
🎨 Praktické využití
- Todo List - osobní úkoly
- Nákupní seznam - položky k nákupu
- Checklist - kontrolní seznam
- Poznámky - rychlé poznámky
- Cíle - tracking cílů
🔗 Související lekce
- Předchozí: 18_forms - formuláře a DOM manipulace
- Další: 20_ajax - AJAX a Fetch API
- Související:
- 11_json - práce s JSON (pro localStorage)
- 06_js_html - základy DOM manipulace