Home > Software engineering >  Why does my delete button does not delete the card
Why does my delete button does not delete the card

Time:11-14

I want to delete the card when we click on the delete button after adding a TODO note
I have created a website which uses localstorage to store notes and display when clicking the create TODO button and it all works but when I click the delete button after the note is created (You have to create a TODO first) it does not delete the div itself
I want to delete the card when we click on the delete button
CODE:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TODO List</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
    <style>
        .main-title {
            text-align: center;
        }

        .input {
            border: 2px solid grey;
        }

        .all-todo {
            display: flex;
            margin: 30px;
        }
    </style>
</head>

<body>
    <nav >
        <div >
            <a  href="#">TODO List</a>
            <button  type="button" data-bs-toggle="collapse"
                data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
                aria-label="Toggle navigation">
                <span ></span>
            </button>
            <div  id="navbarSupportedContent">
                <ul >
                    <li >
                        <a  aria-current="page" href="#">Home</a>
                    </li>
                    <li >
                        <a  href="#">Link</a>
                    </li>
                </ul>
                <form  role="search">
                    <input  type="search" placeholder="Search" aria-label="Search">
                    <button  type="submit">Search</button>
                </form>
            </div>
        </div>
    </nav>
    <h1 >TODO List</h1>
    <div >
        <div >
            <label for="exampleFormControlInput1" >Task Name</label>
            <input type="text"  id="exampleFormControlInput1">
        </div>
        <div >
            <label for="exampleFormControlTextarea1" >Task Details</label>
            <textarea  id="exampleFormControlTextarea1" rows="3"></textarea>
        </div>
        <button type="submit"  id="main-btn">Create TODO</button>
        <button type="button"  id="clr">Clear LocalStorage</button>
    </div>
    <div ></div>

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-OERcA2EqjJCMA /3y gxIOqMEjwtxJY7qPCqsdltbNJuaOe923 mo//f6V8Qbsw3"
        crossorigin="anonymous"></script>
</body>
<script>
    let button = document.getElementById("main-btn")

    button.onclick = () => {
        let key = document.getElementById("exampleFormControlInput1").value
        let value = document.getElementById("exampleFormControlTextarea1").value
        if (key != "" && value != "") {
            iHTML = ""
            localStorage.setItem(key, value)
            iHTML  = `
            <div  style="width: 18rem;">
                <div >
                    <h5 >${key}</h5>
                    <p >${localStorage.getItem(key)}</p>
                    <button type="button" id="note" onclick='${key}.innerHTML=""' >Delete</button>
                </div>
            </div>
            `
            document.getElementsByClassName("all-todo")[0].innerHTML  = iHTML
        }
        else {
            alert("Task Name or Details cannot be empty!")
        }

    }

    let clr_btn = document.getElementById("clr")
    clr_btn.onclick = () => {
        localStorage.clear()
    }

</script>

</html>

CodePudding user response:

The error is thrown on this line onclick='${key}.innerHTML=""'. You will want to first remove the item from local storage e.g: localStorage.removeItem('${key}') and then remove the html. Theres many way of achieveing this but this.parentElement.parentElement.remove() should be sufficient

The complete button should look something like <button type="button" id="note" onclick="localStorage.removeItem('${key}'); this.parentElement.parentElement.remove()" >Delete</button>

Heres a working example: https://jsfiddle.net/qt83bshd/

CodePudding user response:

Well, i post you a simple solution for your problem. Instead of use innerhtml to introuce your todos, yo can create the elements.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TODO List</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
    <style>
        .main-title {
            text-align: center;
        }

        .input {
            border: 2px solid grey;
        }

        .all-todo {
            display: flex;
            margin: 30px;
        }
        /* add css in this poiint to optimize code*/
        .card {
            width: 18rem;
        }
    </style>
</head>

<body>
    <nav >
        <div >
            <a  href="#">TODO List</a>
            <button  type="button" data-bs-toggle="collapse"
                data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
                aria-label="Toggle navigation">
                <span ></span>
            </button>
            <div  id="navbarSupportedContent">
                <ul >
                    <li >
                        <a  aria-current="page" href="#">Home</a>
                    </li>
                    <li >
                        <a  href="#">Link</a>
                    </li>
                </ul>
                <form  role="search">
                    <input  type="search" placeholder="Search" aria-label="Search">
                    <button  type="submit">Search</button>
                </form>
            </div>
        </div>
    </nav>
    <h1 >TODO List</h1>
    <div >
        <div >
            <label for="exampleFormControlInput1" >Task Name</label>
            <input type="text"  id="exampleFormControlInput1">
        </div>
        <div >
            <label for="exampleFormControlTextarea1" >Task Details</label>
            <textarea  id="exampleFormControlTextarea1" rows="3"></textarea>
        </div>
        <button type="submit"  id="main-btn">Create TODO</button>
        <button type="button"  id="clr">Clear LocalStorage</button>
    </div>
    <div ></div>
    

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-OERcA2EqjJCMA /3y gxIOqMEjwtxJY7qPCqsdltbNJuaOe923 mo//f6V8Qbsw3"
        crossorigin="anonymous"></script>
</body>
<script>
    let button = document.getElementById("main-btn")

    button.onclick = () => {
        // collect the div that contains all the todos
        let alltodo = document.querySelector(".all-todo");

        let key = document.getElementById("exampleFormControlInput1").value
        let value = document.getElementById("exampleFormControlTextarea1").value

        // and if it any todo create the card
        if (key != "" && value != "") {

            localStorage.setItem(key, value)
            // with create element we can create the card more easy
            var todo = document.createElement("div");
            todo.setAttribute("class", "card");


            var button = document.createElement("button");
            button.textContent = "eliminar";


            var titulo = document.createElement("h5");

            titulo.textContent = key;

            button.onclick = () => {
                console.log(button.parentElement.remove())
                // in this point we can also remove the todo from the local storage wih localstorage.removeItem()
            }

            // introduce all items in dom 
            todo.appendChild(titulo)
            todo.appendChild(button);
            alltodo.appendChild(todo);
            // iHTML = ""
            // localStorage.setItem(key, value)
            // iHTML  = `
            // <div  style="width: 18rem;">
            //     <div >
            //         <h5 >${key}</h5>
            //         <p >${localStorage.getItem(key)}</p>
            //         <button type="button" id="note" onclick='${key}.innerHTML=""' >Delete</button>
            //     </div>
            // </div>
            // `
            // document.getElementsByClassName("all-todo")[0].innerHTML  = iHTML
            
        }
        else {
            alert("Task Name or Details cannot be empty!")
        }

    }

    let clr_btn = document.getElementById("clr")
    clr_btn.onclick = () => {
        localStorage.clear()
    }

</script>

</html>

  • Related