javascript - 如何为使用 javascript 添加的每个列表项添加删除按钮?
问题描述
我有一个开始尝试构建小型项目的 javascript 项目。我想添加列表删除按钮,但我不知道如何为每一行添加删除按钮。我已经为删除列表项创建了一个删除按钮,但它只出现在最后添加的列表项中。我怎样才能让它出现在每个列表项中?
'use strict';
const rootEl = document.getElementById('root');
const form = document.createElement('form');
form.setAttribute('data-id', 'purchase-form');
rootEl.appendChild(form);
const message = document.createElement('div');
message.setAttribute('data-id', 'message');
form.appendChild(message);
const inputName = document.createElement('input');
inputName.setAttribute('data-input', 'name');
form.appendChild(inputName);
const inputPrice = document.createElement('input');
inputPrice.setAttribute('data-input', 'price');
inputPrice.setAttribute('type', 'number');
form.appendChild(inputPrice);
const buttonSubmit = document.createElement('button');
buttonSubmit.setAttribute('data-action', 'add');
buttonSubmit.textContent = 'Добавить';
form.appendChild(buttonSubmit);
const listPurchases = document.createElement('ul');
listPurchases.setAttribute('data-id', 'purchases-list');
rootEl.appendChild(listPurchases);
const div = document.createElement('div');
div.textContent = 'Самая дорогая покупка: ';
rootEl.appendChild(div);
const span = document.createElement('span');
span.setAttribute('data-id', 'most-expensive');
span.textContent = 'нет покупок';
div.appendChild(span);
const deleteButton = document.createElement('button');
deleteButton.setAttribute('data-action', 'remove');
deleteButton.setAttribute('type', 'button');
deleteButton.textContent = 'Удалить';
let nextId = 1;
const purchases = [];
let cashback = 0.005;
const purchaseForm = rootEl.querySelector('[data-id="purchase-form"]');
const nameInput = purchaseForm.querySelector('[data-input="name"]');
const priceInput = purchaseForm.querySelector('[data-input="price"]');
const button = purchaseForm.querySelector('[data-action="add"]');
const purchasesList = document.querySelector('[data-id="purchases-list"]');
const mostExpensive = rootEl.querySelector('[data-id="most-expensive"]');
const messageEl = rootEl.querySelector('[data-id="message"]');
const Buttondelete = rootEl.querySelector('[data-action="remove"]');
nameInput.focus();
purchaseForm.onsubmit = (evt) => {
evt.preventDefault();
const name = nameInput.value.trim();
const price = Number(priceInput.value);
// cashback = price > 1 ? 0.005 : 0;
if (name !== '' && price !== null && price > 0) {
messageEl.textContent = '';
purchases.unshift({
id: nextId++,
name: name,
price: price,
});
nameInput.focus();
createElement(name);
newPurchase.appendChild(deleteButton);
purchaseForm.reset();
mostExpensive.textContent = `${name} на сумму ${
calculatemostExpensive().price
} с.`;
}
if (name === '') {
messageEl.textContent = '"Значение поля не может быть пустым"';
nameInput.focus();
} else if (!price) {
messageEl.textContent = '"Значение поля не может быть пустым"';
priceInput.focus();
} else if (price < 0) {
messageEl.textContent = '"Значение поля не может быть пустым"';
priceInput.focus();
}
// else if ([price === '']) {
// messageEl.textContent = '"Значение поля не может быть пустым"';
// priceInput.focus();
// }
if (price > 0 && name !== '') {
messageEl.textContent = '';
}
};
let newPurchase;
function createElement(ci) {
newPurchase = document.createElement('li');
newPurchase.setAttribute('data-purchase-id', nextId - 1);
newPurchase.textContent = `${ci} на сумму ${priceInput.value} с. `;
purchasesList.prepend(newPurchase);
purchasesList.insertBefore(newPurchase, newPurchase);
deleteButton.onclick = (evt) => {
evt.preventDefault();
debugger;
newPurchase.parentNode.removeChild(newPurchase);
};
}
let max;
function calculatemostExpensive() {
debugger;
return (max = purchases.reduce(
(prev, current) => (prev.price > current.price ? prev : current),
1
));
}
<!DOCTYPE html>
<html lang="ru">
<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></title>
<link rel="stylesheet" href="./css/styles.css" />
</head>
<body>
<noscript
>Необходимо включить поддержку JavaScript в вашем браузере.</noscript
>
<div id="root"></div>
<script src="./js/app.js"></script>
</body>
</html>
解决方案
我在您的代码中进行了以下更新:
将删除按钮代码移到 onsubmit 中。
传递删除按钮引用,如
createElement(name, deleteButton);
使用事件的目标属性删除按钮,例如:
evt.target.parentNode.remove();
演示:
'use strict';
const rootEl = document.getElementById('root');
const form = document.createElement('form');
form.setAttribute('data-id', 'purchase-form');
rootEl.appendChild(form);
const message = document.createElement('div');
message.setAttribute('data-id', 'message');
form.appendChild(message);
const inputName = document.createElement('input');
inputName.setAttribute('data-input', 'name');
form.appendChild(inputName);
const inputPrice = document.createElement('input');
inputPrice.setAttribute('data-input', 'price');
inputPrice.setAttribute('type', 'number');
form.appendChild(inputPrice);
const buttonSubmit = document.createElement('button');
buttonSubmit.setAttribute('data-action', 'add');
buttonSubmit.textContent = 'Добавить';
form.appendChild(buttonSubmit);
const listPurchases = document.createElement('ul');
listPurchases.setAttribute('data-id', 'purchases-list');
rootEl.appendChild(listPurchases);
const div = document.createElement('div');
div.textContent = 'Самая дорогая покупка: ';
rootEl.appendChild(div);
const span = document.createElement('span');
span.setAttribute('data-id', 'most-expensive');
span.textContent = 'нет покупок';
div.appendChild(span);
let nextId = 1;
const purchases = [];
let cashback = 0.005;
const purchaseForm = rootEl.querySelector('[data-id="purchase-form"]');
const nameInput = purchaseForm.querySelector('[data-input="name"]');
const priceInput = purchaseForm.querySelector('[data-input="price"]');
const button = purchaseForm.querySelector('[data-action="add"]');
const purchasesList = document.querySelector('[data-id="purchases-list"]');
const mostExpensive = rootEl.querySelector('[data-id="most-expensive"]');
const messageEl = rootEl.querySelector('[data-id="message"]');
const Buttondelete = rootEl.querySelector('[data-action="remove"]');
nameInput.focus();
purchaseForm.onsubmit = (evt) => {
evt.preventDefault();
const deleteButton = document.createElement('button');
deleteButton.setAttribute('data-action', 'remove');
deleteButton.setAttribute('type', 'button');
deleteButton.textContent = 'Удалить';
const name = nameInput.value.trim();
const price = Number(priceInput.value);
// cashback = price > 1 ? 0.005 : 0;
if (name !== '' && price !== null && price > 0) {
messageEl.textContent = '';
purchases.unshift({
id: nextId++,
name: name,
price: price,
});
nameInput.focus();
createElement(name, deleteButton);
newPurchase.appendChild(deleteButton);
purchaseForm.reset();
mostExpensive.textContent = `${name} на сумму ${
calculatemostExpensive().price
} с.`;
}
if (name === '') {
messageEl.textContent = '"Значение поля не может быть пустым"';
nameInput.focus();
} else if (!price) {
messageEl.textContent = '"Значение поля не может быть пустым"';
priceInput.focus();
} else if (price < 0) {
messageEl.textContent = '"Значение поля не может быть пустым"';
priceInput.focus();
}
// else if ([price === '']) {
// messageEl.textContent = '"Значение поля не может быть пустым"';
// priceInput.focus();
// }
if (price > 0 && name !== '') {
messageEl.textContent = '';
}
};
let newPurchase;
function createElement(ci, deleteButton) {
newPurchase = document.createElement('li');
newPurchase.setAttribute('data-purchase-id', nextId - 1);
newPurchase.textContent = `${ci} на сумму ${priceInput.value} с. `;
purchasesList.prepend(newPurchase);
purchasesList.insertBefore(newPurchase, newPurchase);
deleteButton.onclick = (evt) => {
evt.preventDefault();
debugger;
evt.target.parentNode.remove();
};
}
let max;
function calculatemostExpensive() {
debugger;
return (max = purchases.reduce(
(prev, current) => (prev.price > current.price ? prev : current),
1
));
}
<!DOCTYPE html>
<html lang="ru">
<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></title>
<link rel="stylesheet" href="./css/styles.css" />
</head>
<body>
<noscript
>Необходимо включить поддержку JavaScript в вашем браузере.</noscript
>
<div id="root"></div>
<script src="./js/app.js"></script>
</body>
</html>
推荐阅读
- java - spring data mongodb接口配置及_class字段的使用
- c - 为什么C中的这个字符串交换函数不交换字符串?
- firebase - 将文档数据检索到一个列表中,其中 documentID 与 currentUser().uid 相同 - Flutter
- r - R数据框转换:将字符观察拆分为多行,重新排列字符串
- kotlin - 如何在 Kotlin 中生成 MD5 哈希?
- rocksdb - 无法在 ubuntu 中编译 Rocksdb java,出现找不到 jni.h 文件的致命错误
- visual-studio-code - VS Code 在新选项卡热键中打开文件
- asp.net-core - 具有 Windows 身份验证的用户角色在 ASP.NET Core 中不起作用
- vue.js - Vuetify v-calendar:动态每日间隔在 Safari 上不起作用
- stripe-payments - 使用 Stripe ACH 将资金转入和转出 Plaid Sandbox 银行账户