I'm trying to improve the code of my first project, to do list
and what I want to do is save the items in the localStorage
, so that when I refresh the browser, they don't get deleted or restarted.
I store the data in an object inside a list and with a unique id for each item; the name that as value has the itemValue
, which is where I store the value of the input.
The problem is that the data is saved in the localStorage
, but when you restart the page they are deleted.
Please if you explain to me what is happening and I would also appreciate if you tell me if my code is legible at a glance and if it is understood or rather if it is a código limpio
.
"use strict"
//date function
const dateElement= document.getElementById("date");
const options= {
weekday:"long",
month:"short",
day:"numeric"
}
const today= new Date();
dateElement.innerHTML= today.toLocaleDateString("en-US",options);
const list= document.getElementById("list");
const input= document.getElementById("input");
const normalButton= document.getElementById("normal");
const finishedTask= document.getElementById("done");
const unfinishedTask= document.getElementById("not-done");
const refreshBtn = document.getElementById("refresh-btn");
document.addEventListener("keyup",(event)=>{ if(event.keyCode === 13) addToDo() });
function addToDo(){
refreshBtn.addEventListener("click",() => refreshPage());
event.preventDefault();
let itemValue= input.value;
if(itemValue === "" || itemValue === null) return alert("Por Favor escribe algo en tu lista");
const itemNew= document.createElement("li");
const deleteButton= document.createElement("button");
const para = document.createElement("p");
const editButton= document.createElement("button");
const checkButton= document.createElement("button");
const buttonsContainer= document.createElement("div");
itemNew.appendChild(buttonsContainer);
buttonsContainer.classList.add("buttons");
//creating text
para.classList.add("text");
const text= document.createTextNode(itemValue);
para.appendChild(text);
//item
itemNew.classList.add("item");
itemNew.appendChild(checkButton);
itemNew.appendChild(para);
list.appendChild(itemNew);
//check-buttton
checkButton.classList.add("checkbox");
checkButton.innerHTML = `<i class="far fa-circle fa-lg"></i>`
checkButton.value= "not-checked";
//edit-button
editButton.classList.add("edit");
editButton.innerHTML = `<i class="far fa-edit"></i>`
buttonsContainer.appendChild(editButton);
//delete-button
deleteButton.classList.add("delete");
deleteButton.innerHTML = `<i class="fas fa-trash-alt"></i>`
buttonsContainer.appendChild(deleteButton);
//checkbox button
checkButton.addEventListener("click",()=>{
if (checkButton.value ==="not-checked") {
checkButton.setAttribute("value","checked");
checkButton.innerHTML = `<i class="far fa-check-circle fa-lg"></i>`
} else {
checkButton.setAttribute("value","not-checked");
checkButton.innerHTML = `<i class="far fa-circle fa-lg"></i>`
}
checkButton.classList.toggle()
para.classList.toggle("completed");
});
//edit button
editButton.addEventListener("click",()=>{
let editText= prompt("Inserte aqui el texto a cambiar ...");
para.innerHTML=editText;
}
);
//delete button
deleteButton.addEventListener("click", ()=> list.removeChild(itemNew) );
//normal button
normalButton.addEventListener("click", ()=> itemNew.setAttribute("style","display:block") );
//finished-task button
finishedTask.addEventListener("click",()=>{
checkButton.value==="checked" ? itemNew.setAttribute("style","display:block")
:itemNew.setAttribute("style","display:none");
});
//unfinished-task button
unfinishedTask.addEventListener("click",()=>{
checkButton.value==="not-checked" ? itemNew.setAttribute("style","display:block")
:itemNew.setAttribute("style","display:none");
});
//AQUI ES DONDE ESTA EL PROBLEMA
let lists = JSON.parse(localStorage.getItem("item.list")) || [];
let data = createDataList(itemValue);
lists.push(data);
save();
function save(){
localStorage.setItem("item.list", JSON.stringify(lists));
}
function createDataList(name){
return {id: Date.now(), name: name,};
}
function refreshPage(){
localStorage.clear();
location.reload();
}
input.value = "";
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="css/style.css">
<link href="https://fonts.googleapis.com/css?family=Roboto+Slab&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto+Condensed:300&display=swap" rel="stylesheet">
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<script src="https://kit.fontawesome.com/09faf5376a.js" crossorigin="anonymous"></script>
<title>To Do List</title>
</head>
<body>
<div class="container">
<div class="header">
<i class="fas fa-sync-alt" id="refresh-btn"></i>
<div class="title-container">
<h1 class="title">To Do List App</h1>
<h2 class="ferre">By Fxrree</h2>
</div>
<div class="date" id="date"></div>
<div class="functionalities">
<button id="normal" class="normal">NORMAL</button>
<button id="done" class="done">DONE</button>
<button id="not-done" class="not-done">NOT-DONE</button>
</div>
</div>
<div class="content">
<ul id="list" class="list"></ul>
</div>
<div class="add-item">
<input type="text" class="input" id="input" placeholder="Add something to do">
<i class="fas fa-plus-circle fa-lg" id="button" onclick="addToDo()"></i>
</div>
</div>
<script src="app.js/app.js"></script>
</body>
</html>
The first thing is to define
lists
in global context to be able to access outside ofaddToDo()
. As soon as the DOM loads you get whatever you saved inlocalStorage
, adding it tolists
.Now we just need to add it to the HTMl, using the function
addToDo
and sending each element as a parameter. Of course, the function was modified to be able to receive it.When creating the content, just check: