Array.push不适用于本地存储

时间:2018-01-07 02:48:31

标签: javascript jquery arrays

我正在创建一个购物车,用户可以将商品添加到购物车。用户点击addtocart按钮后,我想将产品ID,名称,价格和数量保存到本地存储,然后在购物车页面上检索它们。所以我尝试了这个

  var cart = new Array;

    if (cart != []) {
        cart = JSON.parse(localStorage["cart"]);
    }

  $('#addtocart').on('click', function(e) {

var qty = document.getElementById("p-qty").value;
var li = $(this).parent();


var product = {};
product.id = productid;
product.name = document.getElementById("nomenclature").innerHTML;
product.price = document.getElementById("productprice").innerHTML;
product.quantity = qty;

addToCart(product);
});


 function addToCart(product) {
// Retrieve the cart object from local storage
if (localStorage) {
    var cart = JSON.parse(localStorage['cart']);            

    cart.push(product);

    localStorage.setItem('cart', JSON.stringify(cart));
}

// window.location = "html/cart.html"   
}

但我一直收到此错误

  

未捕获的TypeError:cart.push不是函数

我做错了什么,我该如何解决?

3 个答案:

答案 0 :(得分:2)

您不检查localStorage ['cart']是否已定义,并且不检查反序列化变量是否为数组。我建议做这样的事情:

function addToCart(product) {
    if (localStorage) {
        var cart;
        if (!localStorage['cart']) cart = [];
        else cart = JSON.parse(localStorage['cart']);            
        if (!(cart instanceof Array)) cart = [];
        cart.push(product);

        localStorage.setItem('cart', JSON.stringify(cart));
    } 
}

但是,请注意,如果localStorage['cart']中有序列化对象或其他非数组变量,则会使用此方法覆盖它。

答案 1 :(得分:1)

现在有了你的编辑,你在这里遇到的问题是没有意义的。首先将数组设置为空,因此它始终为空。现在第二个问题是 MON TOTAL STREAK_COUNT WANTED RESULT 1/2/1992 1.123077 1 1.123077 (only 1 so 1.12) 2/3/1992 -1.296718 0 3/2/1992 -6.355612 2 -7.65233 (sum of -1.29 and -6.35) 4/1/1992 5.634692 0 5/1/1992 4.180605 2 9.815297 (sum of 5.63 and 4.18) 7/1/1992 -0.101016 0 8/3/1992 -0.706125 2 -0.807141 (sum of -.10 and -.706) 10/1/1992 0.368579 0 11/2/1992 3.822277 0 1/4/1993 2.233359 0 2/1/1993 15.219644 4 21.643859 3/1/1993 -2.647693 1 -2.647693 4/1/1993 1.599094 1 1.599094 永远不会等于[]因此它将始终进入if语句。由于您可能从未将new Array设置为任何内容,因此它将无效。

localStorage["cart"]

所以你需要做的就是摆脱它,因为它什么都不做。接下来,您只需要检查localstorage是否有值,如果没有,则将其设置为一个情感数组。因此添加一个条件,如果未定义,则使用新数组

现在你的密码应该是什么

var cart = new Array;  // <-- you define an array?
if (cart != []) {  // <- than you check the array you just created? How would it have a value if this check would actually work?
    cart = JSON.parse(localStorage["cart"]);
}

或其他方式可能

var cart = []; //define the array
if (localStorage["cart"]) {  // Check that it has a value in storage
    cart = JSON.parse(localStorage["cart"]); //If yes, parse it
}

答案 2 :(得分:1)

HTML5中的

localStorage 是对象,您可以使用 .setItem()设置项目,并通过 .getItem()获取项目

Demo获取旧值,推送新值并使用localStorage保存值


    var Values = [];

    //get olds values
    Values = JSON.parse(localStorage.getItem('Storage')); 

    //push new value
    Values.push(item);

    //saved values
    localStorage.setItem('Storage', JSON.stringify(Values));