如何从 DOM 和数组中删除项目
How do I remove items from DOM and Array
我目前正在尝试构建一个列表应用程序,用户在其中向列表输入一个项目,输入的项目显示在页面上,并被推入一个名为“items”的数组中。
项目显示在页面上并被推送到数组的部分工作正常,以及从页面中删除项目。我 运行 遇到麻烦的地方是从数组中删除。发生的情况是,当项目从 DOM 中删除时,并不总是删除相应的数组元素。
看来同时从页面和数组中删除项目并不是那么容易。而且我需要将项目推送到一个数组,因为这个数组将用于其他我已经弄清楚的东西。
目前,我正在尝试使用 splice,但效果似乎不太好。
我也试过重写这个程序,首先将项目推送到数组,然后使用 for 循环遍历数组并让项目出现在页面上。
下面的 link 指向相关应用程序的实时版本。它托管在我的 Neocities 帐户上。
感谢任何能提供帮助的人!
https://chillaxin-cyborg.neocities.org/ListApp.html
这是我的代码:
<!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>Document</title>
<style>
#myList {
list-style: none;
}
li {
padding: 10px;
max-width: 300px;
background-color: rgb(186, 255, 129);
font-size: larger;
font-weight: bold;
border-style: double;
border-radius: 10px;
text-align: center;
margin: 5px;
}
.remove-btn {
float: right;
background-color: red;
color:black;
}
#itemAdd {
padding: 10px;
font-size: larger;
text-align: center;
}
#itemName {
padding: 10px;
max-width: 300px;
font-size: larger;
font-weight: bold;
border-style: double;
text-align: center;
}
</style>
</head>
<body>
<div class="container main">
<form action="" method="post">
<input type="text" id="itemName">
<button onclick="addItem()" id="itemAdd">ADD</button>
</form>
<div>
<ul id="myList">
</ul>
</div>
</div>
<script>
let items = [];
const addItem = () => {
event.preventDefault();
let myList = document.getElementById('myList');
let listItem = document.createElement('li');
listItem.innerText = itemName.value + " ";
myList.append(listItem);
let removeButton = document.createElement('button');
removeButton.innerText = "-";
removeButton.className = "remove-btn"
removeButton.addEventListener('click', removeItem);
listItem.append(removeButton);
items.push(itemName.value);
document.forms[0].reset();
}
const removeItem = () => {
let item = event.currentTarget.parentNode;
item.remove();
let itemIndex = items.indexOf(item);
items.splice(itemIndex, 1);
}
</script>
</body>
</html>
我在这里盲目编程,如果代码不完美,请与我交流。
问题出在 let itemIndex = items.indexOf(item);
行,您在其中搜索带有节点(类似于 DOM 对象)的字符串数组。
相反,将 data-*
属性添加到您的 <li>
元素,您可以在其中添加用户键入的内容,并通过 dataset property 提取该属性。然后使用该字符串搜索您的 list
数组。
我冒昧地重构了您的一些代码以使其更具可读性。
let items = [];
var createListItem = (text) => {
let listItem = document.createElement('li');
listItem.innerText = text;
listItem.setAttribute('data-value', text); // adding a data attribute
return listItem;
}
var createRemoveButton() {
let removeButton = document.createElement('button');
removeButton.innerText = "-";
removeButton.className = "remove-btn"
removeButton.addEventListener('click', removeItem);
return removeButton;
}
const addItem = () => {
event.preventDefault();
let userInput = itemName.value.trim();
let myList = document.getElementById('myList');
let listItem = createListItem(userInput);
listItem.append(createRemoveButton());
myList.append(listItem);
items.push(userInput);
document.forms[0].reset();
}
const removeItem = (event) => {
let item = event.currentTarget.parentNode;
let userInput = item.dataset.value; // extracting the data attribute
item.remove();
let itemIndex = items.indexOf(userInput);
items.splice(itemIndex, 1);
}
我目前正在尝试构建一个列表应用程序,用户在其中向列表输入一个项目,输入的项目显示在页面上,并被推入一个名为“items”的数组中。
项目显示在页面上并被推送到数组的部分工作正常,以及从页面中删除项目。我 运行 遇到麻烦的地方是从数组中删除。发生的情况是,当项目从 DOM 中删除时,并不总是删除相应的数组元素。
看来同时从页面和数组中删除项目并不是那么容易。而且我需要将项目推送到一个数组,因为这个数组将用于其他我已经弄清楚的东西。
目前,我正在尝试使用 splice,但效果似乎不太好。
我也试过重写这个程序,首先将项目推送到数组,然后使用 for 循环遍历数组并让项目出现在页面上。
下面的 link 指向相关应用程序的实时版本。它托管在我的 Neocities 帐户上。
感谢任何能提供帮助的人!
https://chillaxin-cyborg.neocities.org/ListApp.html
这是我的代码:
<!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>Document</title>
<style>
#myList {
list-style: none;
}
li {
padding: 10px;
max-width: 300px;
background-color: rgb(186, 255, 129);
font-size: larger;
font-weight: bold;
border-style: double;
border-radius: 10px;
text-align: center;
margin: 5px;
}
.remove-btn {
float: right;
background-color: red;
color:black;
}
#itemAdd {
padding: 10px;
font-size: larger;
text-align: center;
}
#itemName {
padding: 10px;
max-width: 300px;
font-size: larger;
font-weight: bold;
border-style: double;
text-align: center;
}
</style>
</head>
<body>
<div class="container main">
<form action="" method="post">
<input type="text" id="itemName">
<button onclick="addItem()" id="itemAdd">ADD</button>
</form>
<div>
<ul id="myList">
</ul>
</div>
</div>
<script>
let items = [];
const addItem = () => {
event.preventDefault();
let myList = document.getElementById('myList');
let listItem = document.createElement('li');
listItem.innerText = itemName.value + " ";
myList.append(listItem);
let removeButton = document.createElement('button');
removeButton.innerText = "-";
removeButton.className = "remove-btn"
removeButton.addEventListener('click', removeItem);
listItem.append(removeButton);
items.push(itemName.value);
document.forms[0].reset();
}
const removeItem = () => {
let item = event.currentTarget.parentNode;
item.remove();
let itemIndex = items.indexOf(item);
items.splice(itemIndex, 1);
}
</script>
</body>
</html>
我在这里盲目编程,如果代码不完美,请与我交流。
问题出在 let itemIndex = items.indexOf(item);
行,您在其中搜索带有节点(类似于 DOM 对象)的字符串数组。
相反,将 data-*
属性添加到您的 <li>
元素,您可以在其中添加用户键入的内容,并通过 dataset property 提取该属性。然后使用该字符串搜索您的 list
数组。
我冒昧地重构了您的一些代码以使其更具可读性。
let items = [];
var createListItem = (text) => {
let listItem = document.createElement('li');
listItem.innerText = text;
listItem.setAttribute('data-value', text); // adding a data attribute
return listItem;
}
var createRemoveButton() {
let removeButton = document.createElement('button');
removeButton.innerText = "-";
removeButton.className = "remove-btn"
removeButton.addEventListener('click', removeItem);
return removeButton;
}
const addItem = () => {
event.preventDefault();
let userInput = itemName.value.trim();
let myList = document.getElementById('myList');
let listItem = createListItem(userInput);
listItem.append(createRemoveButton());
myList.append(listItem);
items.push(userInput);
document.forms[0].reset();
}
const removeItem = (event) => {
let item = event.currentTarget.parentNode;
let userInput = item.dataset.value; // extracting the data attribute
item.remove();
let itemIndex = items.indexOf(userInput);
items.splice(itemIndex, 1);
}