繁体   English   中英

如何使用vanilla javascript一次只检查一个项目?

[英]How to make a loop check off only one item at a time using vanilla javascript?

我正在构建一个简单的待办事项列表,但是我在尝试解决循环中遇到的这个问题时遇到了大约 2 周的麻烦。 有人可以解释一下我做错了什么吗? 我想一次检查每个项目,我目前正在使用 for 循环来遍历每个项目。 我一直面临的问题是循环导致同时检查所有项目。 我尝试过简单的 if else 语句、开关、while 循环、嵌套 for 循环。 任何建议将不胜感激。 代码如下。

Javascript

const check = document.querySelectorAll('.check');
const uncheck = document.querySelectorAll('.uncheck');
const li = document.querySelectorAll('li');

function checkItem(event) {
    for(let i = 0; i < li.length && i < check.length && i < uncheck.length; i++) {

        switch(event.target.classList.contains('far')) {
            case true:
                li[i].style.textDecoration = 'line-through'
                check[i].style.display = 'block';
                uncheck[i].classList.toggle('check');
                break;
            default:
                li[i].style.textDecoration = 'none';
                check[i].style.display = 'none';
                uncheck[i].classList.toggle('uncheck');
        }
    }
}

EJS

    <body onclick="checkItem(event)">

        <div id="wrapper">
            <div id="interface">
                <header>
                    <i class="fas fa-sync-alt" id="delAllBtn"></i>
                    <div id="datebox">
                          <p id="time">4:20pm</p>
                          <br>
                          <p id="date">September 24, 2020</p>  
                    </div>
                </header>
        
                <div id="userInput">
                    <form action="/list" method="POST">
                        <input type="text" placeholder="Enter item.." name="item" autofocus required> 
                        <button type="submit" id="addBtn"><i class="fas fa-plus-circle"></i></button>
                    </form>    
                </div>
        
                <main>
                    <ul id="list">
                        <% for(let i = 0; i < list.length; i++) {%>
                            <li class="list-item">
                                <div class="checkbox">
                                    <i class="far fa-circle uncheck"></i>
                                    <i class="fas fa-check-circle check"></i>
                                </div>
                                <span><%= list[i].item %></span>
                                <div id="buttons">
                                    <button type="submit" data-update="<%= list[i]._id %>" class="saveBtn"><i class="fas fa-edit"></i></button>
                                    <button type="button" data-update="<%= list[i]._id %>" class="editBtn"><i class="fas fa-edit"></i></button>
                                    <button type="button" data-delete="<%= list[i]._id %>" class="delItemBtn"><i class="fas fa-trash-alt"></i></button>   
                                </div>
                            </li>
                        <% } %>
                    </ul>    
                </main>
        
                <footer>
                    <p>Footer</p>
                </footer>
            </div>
        </div>

        <script src="javascripts/main.js"></script>

    </body>


您正在对 for 循环的每次迭代评估 event.target。

您应该根据迭代的当前元素来执行此操作,以便每个元素都根据其自己的属性进行更新。

似乎您已经在这里回答了您自己的问题,因为您使用的是 for 循环,所以所有项目都被选中。 在定义要在单击事件后调用的函数后尝试使用 e.target。 这样,您将只更改您单击的单个项目:

    function checkItem(el) {   
            if (el.classList.contains('uncheck')) {
                el.classList.add("check");
                el.classList.remove("uncheck");
            }
        }

    document.querySelector('#list').addEventListener('click', (e) => {
            checkItem(e.target);
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM