使用JS制作简易待办事项

270 阅读1分钟
效果:

image.png

HTML结构:

<div id="app"> <div class="box"> <h1>待办列表</h1> <div class="tool"> <input autofocus="" class="userTask" type="text" placeholder="请输入代办事项" /> </div> <ul> <li class="finished"> <div> <input class="ck" type="checkbox" /><span class="false" >任务名称</span > </div> <button class="del">X</button> </li> </ul> <section> <span class="unDone">4 未完成</span><a href="#" class="clear">清理 <b class="Done">0</b> 已完成</a> </section> </div> </div>

CSS样式:

* { margin: 0; padding: 0; box-sizing: border-box; } body { background-color: #ccc; } ul { list-style: none; } li { padding: 20px; text-align: left; font-size: 30px; border-bottom: 1px dashed #ccc; display: flex; justify-content: space-between; align-items: center; } li input { margin-right: 10px; } li button { display: none; padding: 5px; } li:hover button { display: inline-block; cursor: pointer; } .finished { text-decoration: line-through; } h1 { margin-bottom: 10px; } .box { background-color: #fff; width: 60vw; padding: 20px 20px 0; margin: 50px auto; } .box .tool input { width: 100%; height: 50px; text-indent: 20px; font-size: 20px; font-style: italic; color: #666; font-weight: 700; } section { height: 50px; display: flex; justify-content: space-between; align-items: center; } a { text-decoration-color: #666; color: inherit; }

JS部分:
//给window添加事件
window.addEventListener('load', function () {
    //获取元素
    let userTask = document.querySelector('.userTask')
    let ul = document.querySelector('ul')
    let clear = document.querySelector('.clear')
    let unDone = document.querySelector('.unDone')
    let Done = document.querySelector('.Done')


    // 模拟数据源
    // let datas = [{state:true,content:'abcd',id:1}]
    //本地存储
    let datas = JSON.parse(localStorage.getItem('todoList')) || []

    //数据渲染
    function init() {
        let htmlStr = ''
        datas.forEach(function (v) {
            htmlStr += `<li class="${v.state ? "finished" : ""}">
                            <div>
                            <input class="ck" type="checkbox" ${v.state ? "checked" : ''}  data-id = "${v.id}"/><span class="false"
                                >${v.content}</span
                            >
                            </div>
                            <button class="del" data-id = "${v.id}">X</button>
                        </li>`

        })
        calculateDone()
        ul.innerHTML = htmlStr
        localStorage.setItem('todoList', JSON.stringify(datas))
        userTask.value = ''
    }

    init()

    //新增代办
    userTask.addEventListener('keydown', function (e) {

        if (e.which == 13) {
            if (userTask.value) {
                let obj = {
                    state: false,
                    content: userTask.value,
                    id: datas.length > 0 ? datas[datas.length - 1].id + 1 : 1
                }
                datas.push(obj)
                init()
            } else {
                alert('请您输入内容')
            }
        }

    })


    //计算Done
    function calculateDone() {
        let count = 0
        for (let i = 0; i < datas.length; i++) {
            if (datas[i].state) {
                count++
            }
        }
        unDone.innerText = datas.length - count + ' 未完成'
        Done.innerText = count
    }
    //清理已完成
    clear.addEventListener('click', function () {
        datas = datas.filter(function (v) {
            return !v.state
        })
        init()
    })


    //选择框
    ul.addEventListener('click', function (e) {
        // 复选框
        if (e.target.className == 'ck') {
            let id = e.target.dataset.id
            datas.forEach(function (v, i) {
                if (v.id == id) {
                    datas[i].state = !datas[i].state
                    init()
                }
            })
        }
        //删除
        else if (e.target.className == 'del') {
            let id = e.target.dataset.id
            datas.forEach(function (v, i) {
                if (v.id == id) {
                    datas.splice(i, 1)
                    init()
                }
            })
        }
    })
})