gpt4 book ai didi

javascript - 无法从购物车中删除商品(在前端)但在后端有效

转载 作者:行者123 更新时间:2023-11-30 14:04:17 25 4
gpt4 key购买 nike

我一直在用 Vanilla JS 构建购物车。我有一个处理 DOM 中所有逻辑的接口(interface),以及一个处理数组操作的后端。

我的问题是尝试从购物车中移除商品的按钮出现问题。不确定为什么我的代码没有从购物车中删除商品,但它绝对适用于我的测试!

我已经尝试将购物车中的商品链接到一个 ID,该 ID 会随着您在购物车中的数量增加而递增(因此购物车中的每个商品都有其自己的唯一 ID)并且我一直在尝试通过addEventLister('click'),然后调用我的 removeItem() 方法,然后在循环外呈现购物车。不幸的是,它不起作用,我被困住了。数据流 cart.js > 界面 > index.html

cart.js

class Cart {
constructor() {
this.cartArray = []
this.total = 0
}
add(item) {
this.cartArray.push(item)
}
removeItem(item) {
var position = this.cartArray.lastIndexOf(item)
this.cartArray.splice(position, 1)
}

calculateTotal() {
var reducedTotal = this.cartArray.reduce( (previous, current) => {
return this.total = previous + current.price
},0)
return reducedTotal
}
}

interface.js - 处理所有 DOM 组件

function iniitalize () {
var itemList = "<table border='1|1'>";
var shoppingCartList = document.getElementById("shoppingCartList")
var total = document.getElementById("total")

var eachParagraph = document.getElementsByClassName('delete-item')

var cart = new Cart

function showItems() {
for (var i = 0; i < items.length; i++) {
itemList +="<tr>";
itemList += "<td>" + items[i].name + "</td>"
itemList += "<td>" + items[i].category + "</td>"
itemList += "<td> " + items[i].price + "</td>"
itemList += "<td> " + items[i].stock + "</td>"
itemList += ` <td> <button id=${items[i].id}>add to cart</button> </td>`
itemList +="</tr>";
}
itemList += "</table>";
document.getElementById("itemsList").innerHTML = itemList;
}

function renderCart() {
var print = "";
var indexOfItem = 0
cart.cartArray.forEach(function(element, index) {
print += `<p id=${index} class=${index}>` + element.name + element.price
+ `<button id=${indexOfItem}>Remove from cart</button> </p>`
indexOfItem ++
})
return print
}

function renderTotal(){
cart.calculateTotal()
return "£" + cart.total
}

function removeItemButtonFunctionality() {
cart.cartArray.forEach(function(element, index) {
shoppingCartList.addEventListener('click', () => {
cart.removeItem(element)
})
})
renderCart()
}


function addToButtonFunctionality() {
items.forEach( function(element, index) {
document.getElementById(index).addEventListener('click', () => {
cart.add(element)
shoppingCartList.innerHTML = renderCart()
total.innerHTML = renderTotal()
})
})
}

showItems()
addToButtonFunctionality()
removeItemButtonFunctionality()
}


window.addEventListener("DOMContentLoaded", iniitalize)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<h1>Shopping retailer</h1>
</head>
<body>

<div id="itemsList"></div>
<br>

<h3>Total:</h3>
<div id="total">
</div>

<h3>Shopping Cart:</h3>

<p id="shoppingCartList"></p>





<script src="src/items.js"></script>
<script src="src/cart.js"></script>
<script src="./interface.js"></script>
</body>
</html>

最佳答案

嗯,这段代码有很多问题。首先,您可能在某些元素上重复了一些 id。每个 id 都需要是唯一的,否则您将无法使用 getElementById 获取元素。通常的做法是在 id 的值前面加上一个关键字,该关键字表示元素的确切含义。

其次,当您在 initialize 函数末尾运行 removeItemButtonFunctionality 时,尚未呈现删除按钮元素。这些事件处理程序需要在您添加项目时动态添加。

第三,这不是问题,但我可能会更改代码,以便在调用 renderCart 时呈现购物车,而不是返回字符串并期望其他函数会这样做为你。例如,在 removeItemButtonFunctionality 上调用 rederCart() 时您没有做任何事情。

这同样适用于 renderTotal

所以,最后,我会把代码改成这样:

function renderCart() {
shoppingCartList.innerHTML = '';
cart.cartArray.forEach(function(element) {
shoppingCartList.innerHTML += `<p id="cart${element.id}">${element.name} ${element.price}<button id="remove${element.id}">Remove from cart</button></p>`;
var removeButton = document.getElementById('remove' + element.id);
removeButton.addEventListener('click', function() {
cart.removeItem(element);
renderCart();
renderTotal();
});
})
}

renderTotal:

function renderTotal(){
total.innerHTML = "£" + cart.calculateTotal();
}

addToButtonFunctionality 只会调用渲染函数:

function addToButtonFunctionality() {
items.forEach( function(element, index) {
document.getElementById(index).addEventListener('click', () => {
cart.add(element)
renderCart();
renderTotal();
})
})
}

在函数的最后你只需要调用:

showItems()
addToButtonFunctionality()

关于javascript - 无法从购物车中删除商品(在前端)但在后端有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55747035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com