Native js реализует локальное хранилище Todolist (to-do)


Вставьте описание изображения сюда

потребность

Сначала уточните функции, которые необходимо реализовать

  1. Введите контент, нажмите кнопку добавления или нажмите Enter, чтобы добавить задачи.
  2. Нажмите кнопку удаления, чтобы удалить
  3. Контент сохраняется локально, и список остается там после обновления и перезапуска.

Код

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
    * {
     
     
        margin: 0;
        padding: 0;
        border: 0;
        outline: none;
        list-style: none;
        box-sizing: border-box;
    }
    body{
     
     
        background-color: #F48C78;
        overflow-x: hidden;
        transform: scale(1.2);
    }
    #container{
     
     
        width: 300px;
        margin: 80px auto 0 auto;
        padding: 10px;
        min-height: 450px;
        background-color: #2F3D4A;
        box-shadow: 0px 3px 10px #8F5246,3px 0px 10px #8F5246;
        border-radius: 10px;
    }
    #container h1{
     
     
        color: #FCFFFF;
        width: 85px;
        margin: 30px auto;
    }
    #input {
     
     
        font-size: 0;   
        position: relative;
    }
    #input input{
     
     
        width: 80%;
        height: 30px;
        margin-left: 9%;
        border-radius: 15px;
        padding: 5px 10px;
    }
    #input input::-webkit-input-placeholder{
     
      /* chrome safari*/
        color: #AFB2B9;
        text-align: center;
    }
    #input input::-moz-placeholder{
     
      /* 火狐获取placeholder*/
        color: #AFB2B9;
        text-align: center;
    }
    #input button{
     
     
        width: 45px;
        height: 30px;
        border-radius: 0 15px 15px 0;
        background-color: #F48C78;
        position: absolute;
        right: 30px;
        cursor: pointer;
        opacity: 0;
        transition: all 0.5s 0.1s;
        visibility: hidden;
        color: #fff;
    }
    #input input:focus + button, #input button:hover{
     
     
        opacity: 1;
        visibility: visible;
    }
    #input button:hover{
     
     
        background-color: #CD4F35;
    }
    ul{
     
     
        margin: 30px 0;
    }
    ul li{
     
     
        width: 224px;
        margin:  10px 0 0 9%;
        color: #FCFFFF;
        background-color: #283140;
        font-weight: 600;
        padding: 5px 10px;
        border-radius: 10px;
    }
    ul li:hover{
     
     
        background-color: #455878;
        transition: all 0.4s ;
    }

    .removebtnContainer{
     
     
        margin: 4px 5px 0 0;
        float: right;
        border-radius: 50%;
        width: 13px;
        height: 13px;
        border: solid #FD8263;
        position: relative;
        top: 50%;
        transition: all 0.2s ;
        cursor: pointer;
    }
    .removebtnContainer:hover{
     
     
        background-color: #FD8263;
    }
    </style>
</head>
<body>
    <!-- html部分属实简单 -->
    <div id="container">
        <h1>Todos</h1>
        <div id="input">
            <input type="text" id="content" placeholder="别玩了懒狗" onfocus="this.placeholder = ''" onblur="this.placeholder = '别玩了懒狗'">
            <!-- placeholder 内容自己改 -->
            <button>add</button>
        </div>

        <ul id="ul"></ul>
    </div>

    <script>
        let todoList = document.getElementsByTagName('ul')[0]; 
        let inputElement = document.getElementById('content');
        let buttonElement = document.getElementsByTagName('button')[0];
        let todos = JSON.parse(localStorage.getItem('todos')) || [];  // todos数组保存待办项 
        
        function addNew(content){
     
     
            let item = document.createElement('li');
            item.innerText = content; 
            addNewButton(item); 
            todoList.appendChild(item);

            todos.push(content);
            save();
        }
        function addNewButton(item){
     
     
            let container = document.createElement('div');
            container.className = 'removebtnContainer';
            item.appendChild(container);
        }
        function save(){
     
     
            localStorage.setItem('todos',JSON.stringify(todos)); // 将数组转为字符串并储存在本地
        }
        function reLoad(){
     
       
            
            todos.forEach((content) => {
     
     
                let item = document.createElement('li');
                item.innerText = content;
                addNewButton(item);
                todoList.appendChild(item);
            });
        }

        function reMove(item){
     
     
            item.parentNode.remove(); 
            todos.forEach((content, index) => {
     
              
                if(item.parentNode.innerText.trim() == content){
     
     
                    todos.splice(index, 1);  // splice方法 删除index开始的 1项
                }
            })

            save();
        }

        /* ↑ 函数声明
        -------------------------------------------------------------------------
        事件、执行 ↓                                                              */
        
        reLoad(); //从本地载入

        /*两种方式添加待办项*/
        //鼠标点击添加
        buttonElement.addEventListener('click', () =>{
     
     
            if(inputElement.value){
     
     
                addNew(inputElement.value.trim());
                inputElement.value = '';
            }
        },false)
        //键盘回车添加
        inputElement.addEventListener('keyup', (event) =>{
     
     
            console.log(event); 
            if(event.keyCode == 13 && inputElement.value){
     
       //回车 keyCode === 13
                addNew(inputElement.value.trim());
                inputElement.value = '';
            }
        })

        //点击删除
        todoList.addEventListener('click',(event)=>{
     
     
            if(event.target.className == 'removebtnContainer'){
     
     
                reMove(event.target);
            }
        },false)
    </script>
</body>

</html>

Часть js не длинная, и логика понятна.
CSS - самый сложный

Частичное объяснение

Локальное хранилище

Учебное пособие по localStorage.
Используйте localStorage для локального хранения и чтения
его каждый раз при открытии страницы. Поскольку localStorage хранит данные в строковой форме, используйте JSON для преобразования массива в строковый формат.

localStorage.setItem('todos',JSON.stringify(todos));
Вставьте описание изображения сюда

Добавить к

addEventListenerПередайте объект события в функцию последующей обработки

        inputElement.addEventListener('keyup', (event) =>{
    
      //此处event为addEventListener传入
            console.log(event); 
            if(event.keyCode == 13 && inputElement.value){
    
      //回车 keyCode === 13
                addNew(inputElement.value.trim());
                inputElement.value = '';
            }
        })

Метод массива

forEach, splice см. массив методов

ошибка

В настоящее время существует ошибка при удалении, и элементы с одинаковым содержимым будут удалены вместе
. Недостатки поиска по содержимому таковы, что
я не придумал хорошего решения.

рекомендация

отblog.csdn.net/S_aitama/article/details/107724017