仅从本地存储中删除选定的列表项-Pure JS

问题描述 投票:2回答:3

我在这里面临一些麻烦。我正在尝试使用本地存储创建待办事项列表,但我要做的唯一事情就是将列表项添加到本地存储中,并从本地存储中删除all items,但是我无法删除一个从列表中选择项目。有人可以帮我看看吗:

1)从列表中删除所选的单个项目。2)将复选框放在列表文本之前。3)点击复选框,切换类列表“ strike”,并在加载/刷新页面时记住它。

这是我的代码:

<body>
    <div>
        <h1>To-do's list</h1>
        <div>
            <input type="text" id="textBox">
            <button id="enterBtn" type="button">Enter</button>

            <div>
                <uL id="ul">
                    <li class="li"><input type="checkbox" class="checkBox" name=""> Buy food for Siboo <button class="deleteBtn">Delete</button></li>
                    <li class="li"><input type="checkbox" class="checkBox" name=""> Get a new controller <button class="deleteBtn">Delete</button></li>
                </uL><br>

                <button id="deleteAllBtn"><i class="fa fa-trash"></i> Delete All Items</button>
            </div>
            <script type="text/javascript" src="script.js"></script>
        </div>
</body>

这里是CSS:

.strike {
    text-decoration: line-through;
   }

这是我的JS:

var textBox = document.getElementById("textBox");
var enterBtn = document.getElementById("enterBtn");
var ul = document.querySelector("ul");
var li = document.getElementsByClassName("li");
var checkBox = document.getElementsByClassName("checkBox");
var deleteBtn = document.getElementsByClassName("deleteBtn");
var deleteAllBtn = document.getElementById("deleteAllBtn");

var itemsArray = localStorage.getItem('items') ? JSON.parse(localStorage.getItem('items')) : [];

localStorage.setItem('items', JSON.stringify(itemsArray));
var data = JSON.parse(localStorage.getItem('items'));

// Functions *********************

// Adding New Items to List - adding list element with checkbox and delete button *********************
function addNewItemToList(text)
{   
    itemsArray.push(textBox.value);
    localStorage.setItem('items', JSON.stringify(itemsArray));
    liMaker(textBox.value);

}

function liMaker(text) {

    var newLi = document.createElement("li");
    newLi.textContent = text;
    newLi.className = "li";
    ul.appendChild(newLi);

    var createCheckBox = document.createElement("input");
    createCheckBox.type = "checkbox";
    createCheckBox.className = "checkBox";
    newLi.appendChild(createCheckBox);

    var createDeleteButton = document.createElement("button");
    var nameButtonDelete = document.createTextNode("Delete");
    createDeleteButton.appendChild(nameButtonDelete);
    createDeleteButton.className = "deleteBtn";
    newLi.appendChild(createDeleteButton);

}

data.forEach(item => {
    liMaker(item);
});


// CheckBox ELEMENT - click on checkBox to strike the list item off list*********************
function checkBoxFunction() {
    for (var i = 0; i < checkBox.length; i++) {
        checkBox[i].onclick = function () {
            this.parentNode.classList.toggle("strike");
        }}
}

// // DELETE BUTTON - click the delete button to delete the list item *********************
function deleteBtnFunction() {
    for (var i = 0; i < deleteBtn.length; i++) {
        deleteBtn[i].onclick = function () {
            this.parentNode.parentNode.removeChild(this.parentNode);

        }}
}

// DELETE ALL BUTTON - click the Delete ALl Items button to remove all items from the list *********************
function deleteAllBtnFunction()
{
    localStorage.clear();
    while (ul.firstChild) {
    ul.removeChild(ul.firstChild);
  }
  itemsArray = [];
}

// TEXTBOX - press enter key to add an item to list *********************
function textBoxFunction()
{
    if (event.keyCode === 13 && textBox.value.length > 0)
    {
        addNewItemToList();
        textBox.value = "";
    }
    else if (event.keyCode === 13)
    {
        alert("Please enter an item to-do!");
    }
}

// ENTER BUTTON - click the enter button to add item to list *********************
function enterBtnFunction()
{
    if (textBox.value.length > 0)
    {
        addNewItemToList();
        textBox.value = "";
    }
    else
    {
        alert("Please enter an item to-do!");
    }
}

listItemFunction();
deleteBtnFunction();

// Event Listeners *********************
textBox.addEventListener("keypress", textBoxFunction);
enterBtn.addEventListener("click", enterBtnFunction);
deleteAllBtn.addEventListener("click", deleteAllBtnFunction);
// End of Event Listeners *********************
javascript storage local
3个回答
1
投票

localStorage.removeItem(/*key*/);


0
投票

我不是专业人士,但最近我创建了这样的待办事项应用程序。添加新项后,我发现操作侦听器不计算它们。因此,在将元素添加到DOM之后,我将事件侦听器插入了新的元素创建函数中。

这是我的建议

首先,您必须将jQuery-3.2.1.slim.min.js链接到您的项目

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>

将此代码放到liMaker函数的末尾。

 $('input[type="checkbox"]').click(function() {

        if ($(this).is(':checked')) {
           //Call your function
           console.log(this.id)
        }
     });

创建列表元素时,请为每个元素赋予唯一的ID(将其添加到您的复选框中)。也许您可以给他们数组索引。

createCheckBox.id ={unique id}

完成后,单击复选框以调用上述功能。在该函数中,this.id是您提供给复选框的唯一值。然后,您可以使用它从数组中删除该索引。

第二种方法(纯JS)为所有复选框指定一个通用的类名,并为其指定一个唯一的ID。

const checkBoxes = document.querySelectorAll(".{common_class_name}")

for(const cb of checkBoxes){
        button.addEventListener('click',function(){
            let id = this.id
            /*this id is the value you gave to the checkbox.
              Call your deleting methods here*/
        })
    }

将此方法放在元素创建方法的末尾。这必须在每次添加元素时运行。

我复制了您的代码,但我的方法运行正常。我是一个初学者,也许有更好的方法可以做到这一点。但我的方法有效。

祝你好运


0
投票

您可以使用此功能删除特定的项目并将其再次保存到本地存储:

function removeItem(text) {
    var items = JSON.parse(localStorage.getItem("items"));
    items = items.filter(function(e) {return e !== text; });
    localStorage.setItem("items", JSON.stringify(items));
}

removeItem("itemname");
© www.soinside.com 2019 - 2024. All rights reserved.