Bikin To-Do List Simpel Pakai JavaScript Murni (Vanilla JS)
Halo gaes! Pengen nyemplung ke dunia ngoding JavaScript tapi bingung mulai dari mana? Atau udah sering pake framework tapi penasaran vibes ngoding murni alias Vanilla JS? Nah, pas banget nih! Kita bakal spill tuntas gimana caranya bikin aplikasi To-Do List sederhana yang fungsional pake JavaScript murni, tanpa embel-embel framework atau library lainnya. Dijamin, ini project yang asik banget buat ngebangun fondasi skill JS kamu!
Kenapa To-Do List dan Kenapa JavaScript Murni?
Sebelum kita skuy ngoding, yuk pahami dulu kenapa project To-Do List ini jadi bestie buat pemula:
- Fundamental Banget: Kamu bakal belajar dasar-dasar DOM manipulation (gimana cara JS "ngobrol" sama elemen HTML), event handling (gimana JS nanggepin aksi user), dan pengelolaan data.
- Visual dan Interaktif: Hasilnya langsung kelihatan di browser. Kamu bisa langsung interaksi, nambahin, nyoret, atau ngehapus tugas. Seru, kan?
- Bikin PD: Setelah ini jadi,
autokamu bakal ngerasa lebih pede buatexploreproject-project JS lainnya yang lebih kompleks. - JavaScript Murni (Vanilla JS): Ini penting
banget! Dengan pake JS murni, kamu jadi pahamjeroankerja JS. Nanti kalau udah paham dasar, mau belajar React, Vue, atau Angular, jadi jauh lebih gampang dan enggakkagok.
Siap? Gaskeun!
Struktur Project Kita
Kita bakal bikin tiga file standar: index.html, style.css, dan script.js. Simpel aja kok.
1. Setup HTML (index.html)
Pertama, kita siapkan struktur dasar HTML-nya. Ini bakal jadi "kerangka" To-Do List kita.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>To-Do List Simple - Vanilla JS</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<h1>My To-Do List</h1>
<div class="input-section">
<input type="text" id="task-input" placeholder="Apa yang mau kamu lakukan hari ini?">
<button id="add-task-btn">Tambah Tugas</button>
</div>
<ul id="task-list">
<!-- Tugas akan muncul di sini -->
</ul>
</div>
<script src="script.js"></script>
</body>
</html>
Penjelasan Singkat:
div.container: Wadah utama biar rapi.h1: Judul aplikasi.div.input-section: Adainputbuat nulis tugas baru danbuttonbuat nambahin. Ingatid="task-input"danid="add-task-btn", ini penting buat JS nanti.ul#task-list:unordered listtempat tugas-tugas kita bakal nongol. Ini juga punyaidkhusus.script src="script.js": Ini yang paling penting! Ini bakal nyambungin file JavaScript kita. Pastikan taruh di paling bawah<body>biar HTML-nya ke-load semua sebelum JS-nya dieksekusi.
2. Sedikit Sentuhan CSS (style.css)
Biar enggak polosan banget, kita kasih sedikit styling biar nyaman dilihat. Styling ini enggak akan terlalu dibahas mendalam karena fokus kita di JS ya gaes.
body {
font-family: 'Arial', sans-serif;
background-color: #f4f7f6;
display: flex;
justify-content: center;
align-items: flex-start; /* Align to top */
min-height: 100vh;
margin: 0;
padding-top: 50px; /* Add some padding from top */
box-sizing: border-box;
}
.container {
background-color: #ffffff;
padding: 30px;
border-radius: 10px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
width: 100%;
max-width: 500px;
}
h1 {
text-align: center;
color: #333;
margin-bottom: 30px;
}
.input-section {
display: flex;
margin-bottom: 20px;
gap: 10px; /* Jarak antar elemen */
}
#task-input {
flex-grow: 1;
padding: 12px 15px;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 16px;
}
#task-input:focus {
outline: none;
border-color: #4CAF50;
box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.2);
}
#add-task-btn {
background-color: #4CAF50;
color: white;
border: none;
padding: 12px 20px;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s ease;
}
#add-task-btn:hover {
background-color: #45a049;
}
#task-list {
list-style: none;
padding: 0;
}
#task-list li {
background-color: #f9f9f9;
padding: 15px;
margin-bottom: 10px;
border-radius: 5px;
display: flex;
align-items: center;
justify-content: space-between;
transition: background-color 0.3s ease, text-decoration 0.3s ease;
}
#task-list li.completed {
background-color: #e0ffe0; /* Warna lebih hijau muda untuk yang selesai */
text-decoration: line-through;
color: #888;
}
#task-list li span {
flex-grow: 1;
cursor: pointer; /* Biar kelihatan bisa diklik */
}
#task-list li button {
background-color: #f44336;
color: white;
border: none;
padding: 8px 12px;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
margin-left: 10px;
transition: background-color 0.3s ease;
}
#task-list li button:hover {
background-color: #d32f2f;
}
3. Otak Utamanya: JavaScript Murni (script.js)
Nah, ini dia main course-nya, ngab! Kita bakal tulis semua logikanya di sini.
// 1. Ambil elemen-elemen HTML yang dibutuhkan
const taskInput = document.getElementById('task-input');
const addTaskBtn = document.getElementById('add-task-btn');
const taskList = document.getElementById('task-list');
// 2. Fungsi untuk menyimpan tugas ke Local Storage
function saveTasksToLocalStorage(tasks) {
localStorage.setItem('tasks', JSON.stringify(tasks));
}
// 3. Fungsi untuk mengambil tugas dari Local Storage
function getTasksFromLocalStorage() {
const tasksString = localStorage.getItem('tasks');
return tasksString ? JSON.parse(tasksString) : [];
}
// 4. Fungsi untuk menambahkan tugas baru
function addTask(taskText, isCompleted = false) {
// Validasi input: Jangan tambahkan tugas kosong
if (taskText.trim() === '') {
alert('Tugas tidak boleh kosong, gaes!');
return;
}
// Buat elemen <li> baru
const listItem = document.createElement('li');
listItem.classList.add('task-item'); // Tambahkan class untuk styling
// Tambahkan class 'completed' jika tugas sudah selesai
if (isCompleted) {
listItem.classList.add('completed');
}
// Buat elemen <span> untuk teks tugas
const taskSpan = document.createElement('span');
taskSpan.textContent = taskText;
taskSpan.addEventListener('click', () => {
// Toggle class 'completed' saat span diklik
listItem.classList.toggle('completed');
updateAndSaveTasks(); // Update status di local storage
});
// Buat tombol delete
const deleteBtn = document.createElement('button');
deleteBtn.textContent = 'Hapus';
deleteBtn.addEventListener('click', () => {
// Hapus elemen <li> dari daftar
taskList.removeChild(listItem);
updateAndSaveTasks(); // Update di local storage setelah dihapus
});
// Masukkan span dan tombol ke dalam <li>
listItem.appendChild(taskSpan);
listItem.appendChild(deleteBtn);
// Masukkan <li> ke dalam <ul>#task-list
taskList.appendChild(listItem);
// Kosongkan input setelah tugas ditambahkan
taskInput.value = '';
// Simpan tugas ke local storage setiap kali ada perubahan
updateAndSaveTasks();
}
// 5. Fungsi untuk merender semua tugas dari Local Storage saat halaman dimuat
function renderTasks() {
taskList.innerHTML = ''; // Bersihkan daftar tugas yang ada
const tasks = getTasksFromLocalStorage();
tasks.forEach(task => {
addTask(task.text, task.completed); // Render setiap tugas yang ada
});
}
// 6. Fungsi untuk mengupdate dan menyimpan semua tugas ke Local Storage
function updateAndSaveTasks() {
const currentTasks = [];
taskList.querySelectorAll('li').forEach(listItem => {
currentTasks.push({
text: listItem.querySelector('span').textContent,
completed: listItem.classList.contains('completed')
});
});
saveTasksToLocalStorage(currentTasks);
}
// 7. Event Listener untuk tombol "Tambah Tugas"
addTaskBtn.addEventListener('click', () => {
addTask(taskInput.value);
});
// 8. Event Listener untuk menekan 'Enter' di input
taskInput.addEventListener('keypress', (event) => {
if (event.key === 'Enter') {
addTask(taskInput.value);
}
});
// 9. Panggil fungsi renderTasks saat halaman pertama kali dimuat
document.addEventListener('DOMContentLoaded', renderTasks);
Penjelasan Kode script.js:
-
Langkah 1: Mengambil Elemen HTML Kita pakai
document.getElementById()buat "pegang" elemeninput,button, danuldari HTML. Ini penting biar JavaScript bisa berinteraksi sama elemen-elemen tersebut. -
Langkah 2 & 3:
Local StorageIni bagian kerennya!localStoragedi browser itu kayak "otak" buat nyimpen data secara lokal. Jadi, To-Do List kita enggak akan hilang kalau browser di-refresh atau ditutup.saveTasksToLocalStorage(): Menyimpan array tugas kelocalStorage. Kita pakaiJSON.stringify()karenalocalStoragecuma bisa nyimpan data dalam bentuk string.getTasksFromLocalStorage(): Mengambil data tugas darilocalStoragedan mengubahnya kembali jadi array objek pakaiJSON.parse().
-
Langkah 4:
addTask(taskText, isCompleted = false)Ini fungsi inti buat nambahin tugas baru.- Validasi: Cek biar enggak nambahin tugas kosong.
document.createElement('li'): Bikin elemen<li>baru di memory.listItem.classList.add('task-item'): Nambahin classtask-itembiar bisa di-styling.document.createElement('span')&textContent: Bikin<span>buat teks tugasnya.addEventListener('click', ...)untuktaskSpan: Setiap<span>diklik, kitatoggleclasscompleteddi<li>induknya. Ini buat efekline-through(coret) dan ganti warna latar.document.createElement('button'): Bikin tombol "Hapus".addEventListener('click', ...)untukdeleteBtn: Kalau tombol hapus diklik, elemen<li>(parent dari tombol) bakal dihapus daritaskList.listItem.appendChild(taskSpan); listItem.appendChild(deleteBtn);: Masukinspandanbuttonke dalam<li>.taskList.appendChild(listItem): Masukin<li>yang udah lengkap tadi ke dalam<ul>induknya.taskInput.value = '': Setelah tugas ditambahkan, input dikosongin lagi.updateAndSaveTasks(): Ini dipanggil setiap ada penambahan, penghapusan, atau perubahan status tugas, supaya data dilocalStorageselalu sinkron.
-
Langkah 5 & 6:
renderTasks()danupdateAndSaveTasks()renderTasks(): Fungsi ini dipanggil pas halaman pertama kali dimuat. Dia ngambil semua data tugas darilocalStorageterus nampilin satu per satu ke UI.updateAndSaveTasks(): Fungsi ini "memindai" semua tugas yang ada di UI, bikin objek data baru dari tugas-tugas itu, lalu menyimpannya kelocalStorage.
-
Langkah 7 & 8:
Event ListeneraddTaskBtn.addEventListener('click', ...): Setiap tombol "Tambah Tugas" diklik, fungsiaddTask()dipanggil dengan nilai dari input.taskInput.addEventListener('keypress', ...): Ini buatuser experienceyang lebih baik. Kalau user ngetik tugas terus tekanEnter, tugasnya langsung otomatis tertambah.
-
Langkah 9:
DOMContentLoadeddocument.addEventListener('DOMContentLoaded', renderTasks);Ini pentingbanget! Kode ini memastikan fungsirenderTasks(yang nampilin semua tugas darilocalStorage) bakal dijalankan setelah seluruh struktur HTML dan DOM selesai di-load oleh browser. Jadi, pas buka halaman, tugas yang udah disimpen sebelumnya langsung muncul.
Demo dan Hasil Akhir
Setelah semua kode di atas kamu tulis di file masing-masing, coba buka index.html di browser kamu. Harusnya auto muncul To-Do List yang sudah bisa kamu pakai. Kamu bisa:
- Menambahkan tugas baru.
- Menandai tugas sebagai selesai (dicoret) dengan mengklik teks tugasnya.
- Menghapus tugas.
- Melihat tugas tetap ada meskipun browser di-refresh (karena pakai
localStorage!).
Keren abis kan? Kamu baru aja bikin aplikasi web interaktif pake JS murni!
Tips dan Tantangan Selanjutnya
- Validasi Lebih Lanjut: Gimana kalau inputnya ada spasi doang? Coba tambahin validasi lagi.
- Filter Tugas: Tambahin tombol "Semua", "Selesai", "Belum Selesai" buat nyaring tugas.
- Edit Tugas: Bikin fitur biar teks tugas bisa diedit setelah ditambahkan.
- Prioritas: Tambahin opsi prioritas (tinggi, sedang, rendah) ke setiap tugas.
- Konfirmasi Hapus: Sebelum menghapus, minta konfirmasi dulu pake
confirm('Yakin mau hapus?').
Kesimpulan
Nah, ngab, itu dia step-by-step bikin To-Do List sederhana pake JavaScript murni. Project ini emang kelihatan kecil, tapi manfaatnya gede banget buat ngasah fundamental kamu di DOM manipulation, event handling, dan localStorage. Dengan paham konsep-konsep dasar ini, kamu auto bakal lebih siap buat belajar framework atau library JavaScript yang lebih kompleks di masa depan.
Jangan pernah berhenti explore dan experiment, ya! Semangat terus ngodingnya! Keep coding and stay awesome!
Berikan Rating
Komentar (0)
Silakan login untuk memberikan komentar.
Login SekarangKata Kunci
Pembaca (1)
Belum ada komentar. Jadilah yang pertama!