Js 购物车;localStorage 将我的购物车设置为空
2017-01-09
1036
我正在尝试创建一个基本的购物车以进行练习,但遇到了这个错误:
Uncaught TypeError: Cannot read property 'push' of null.
错误本身很明显,我只是不知道如何从逻辑上去修复它。
它发生在我的 addItem() 函数中,如下所示:
//adds items to the cart
function addItem(name, price, quantity) {
/*checks to see if the item with the identical name exists in the cart
if so, it will only increment the quantity of the said item (no redundancies)*/
for (var i in cartShop) {
if(cartShop[i].name === name) {
cartShop[i].quantity += quantity;
saveLocalCart();
return;
};
};
var item = new Item(name, price, quantity);
cartShop.push(item);
saveLocalCart();
};
然后在代码中进一步向下,我调用我的 loadLocalCart() 函数:
//a function for retrieving the cart state to the user
function loadLocalCart() {
//we use json.parse to return the stringified object back to a complex object.
cartShop = JSON.parse(localStorage.getItem("cartSession"));
};
loadLocalCart();
此时,只有当我在 cartShop 数组中至少有一个项目对象时,它才能正常工作,但正如您所见,如果您刚刚启动会话,这个函数几乎将整个购物车设置为几乎为空。
当我尝试实现此功能时会触发此错误:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
//assigning a click event to DOM object
$(".add-to-cart").click(function(event){
//prevents the page from being refreshed
event.preventDefault();
//sets the name variable to a clicked data-name
var name = $(this).attr("data-name");
//sets the price to the number version of data-price attribute
var price = Number($(this).attr("data-price"));
addItem(name, price, 1);
displayCart();
});
我很感谢你们对如何处理这个问题的意见。如果你们感兴趣的话,我正在关注 这个 视频指南播放列表。
2个回答
只需确保 cartShop 在加载时不为空,如果为空,则将其设为空数组
function loadLocalCart() {
//we use json.parse to return the stringified object back to a complex object.
cartShop = JSON.parse(localStorage.getItem("cartSession"));
if(!cartShop) cartShop = [];
};
另外,不要对数组使用
for...in
循环,因为它可能会迭代非数组元素的键。您可以改用
for...of
或普通 for 循环
for(let item of cartShop) {
if(item.name === name) {
item.quantity += quantity;
saveLocalCart();
return;
};
}
Patrick Evans
2017-01-09
您可以尝试将以下内容添加为 addItem 方法的第一行。
cartShop = cartShop || [];
如果声明了 cartShop,此代码将“cartShop”声明为等于“cartShop”,否则它将等于一个新数组。
您也可以在 loadLocalCart 方法中使用它:
cartShop = JSON.parse(localStorage.getItem("cartSession")) || [];
但此问题可能是由变量的范围引起的,您可能需要调查一下。
jaxwilko
2017-01-09