Dynamic To-Do App with JavaScript: Array Methods + DOM Manipulation
This app will allow you to:
- Add tasks
- Mark tasks as completed
- Delete tasks
- Sort tasks
- Drag-and-drop tasks to reorder
HTML Structure
<div id="todo-app">
<h1>My To-Do List</h1>
<input type="text" id="task-input" placeholder="Add a task" />
<button id="add-btn">Add Task</button>
<button id="sort-btn">Sort Tasks</button>
<ul id="task-list"></ul>
</div>
CSS (Optional, for clarity)
<style>
#task-list li {
padding: 8px;
border: 1px solid #ccc;
margin-bottom: 4px;
cursor: move;
list-style: none;
}
#task-list li.completed {
text-decoration: line-through;
color: gray;
}
</style>
JavaScript: Array + DOM + Events
<script>
let tasks = []; // array to store tasks
const input = document.getElementById("task-input");
const addBtn = document.getElementById("add-btn");
const sortBtn = document.getElementById("sort-btn");
const taskList = document.getElementById("task-list");
// Render the tasks
function renderTasks() {
taskList.innerHTML = "";
tasks.forEach((task, index) => {
const li = document.createElement("li");
li.textContent = task.text;
li.className = task.completed ? "completed" : "";
li.draggable = true;
// Toggle completed
li.addEventListener("click", () => {
tasks[index].completed = !tasks[index].completed;
renderTasks();
});
// Delete task on double click
li.addEventListener("dblclick", () => {
tasks.splice(index, 1);
renderTasks();
});
// Drag and drop
li.addEventListener("dragstart", (e) => {
e.dataTransfer.setData("text/plain", index);
});
li.addEventListener("dragover", (e) => e.preventDefault());
li.addEventListener("drop", (e) => {
e.preventDefault();
const draggedIndex = e.dataTransfer.getData("text");
const temp = tasks[draggedIndex];
tasks.splice(draggedIndex, 1);
tasks.splice(index, 0, temp);
renderTasks();
});
taskList.appendChild(li);
});
}
// Add new task
addBtn.addEventListener("click", () => {
const text = input.value.trim();
if (!text) return;
tasks.push({ text, completed: false });
input.value = "";
renderTasks();
});
// Sort tasks alphabetically
sortBtn.addEventListener("click", () => {
tasks.sort((a, b) => a.text.localeCompare(b.text));
renderTasks();
});
// Optional: Press Enter to add task
input.addEventListener("keypress", (e) => {
if (e.key === "Enter") addBtn.click();
});
</script>
Features in Action
- Add Tasks → Enter text and click "Add Task" or press Enter.
- Mark Completed → Click a task to toggle completion.
- Delete Task → Double-click a task to remove it.
- Sort Tasks → Click "Sort Tasks" to reorder alphabetically.
- Drag-and-Drop → Drag a task to change its order.
How This Combines Everything
- Array Methods:
push,splice,sort, and array indexing for manipulation. - DOM Manipulation:
createElement,appendChild,innerHTML,className. - Event Handling:
click,dblclick,dragstart,drop,dragover,keypress. - Dynamic Rendering:
renderTasks()updates the UI every time the array changes.