【问题标题】:How do I make my shopping cart items still exist even when i refresh the page?即使刷新页面,如何使我的购物车项目仍然存在?
【发布时间】:2020-04-17 16:45:53
【问题描述】:

我的购物车是用 JavaScript 制作的。一切正常,但当我刷新页面时却不行,那么我所需要的只是一种方法,即使在我刷新页面时也能保存项目并且不会丢失它们。

如果可以,我可以使用localStorge 吗?或者我应该为此使用mysql,如果是的话,如何使用?

您不必查看我的所有代码,我只需要一种方法来使这件事成为可能。


if (document.readyState == 'loading') {
    document.addEventListener('DOMContentLoaded', ready)
} else {
    ready()
}

function ready() {

    $(".CheckOutButton").hide();
    var removeBtns = document.getElementsByClassName('cartRemovingBtn')
    for(var i=0; i<removeBtns.length;i++) {
        var removeButton = removeBtns[i]
        removeButton.addEventListener('click' , removeCartItem)
    }

    var addToCartBtns = document.getElementsByClassName('addToCartBtn')
    for(var i=0; i<addToCartBtns.length;i++) {
        var addToCartbtn = addToCartBtns[i]
        addToCartbtn.addEventListener('click' , addToCartClicked)

    }

}

function addToCartClicked(event) {
    var btn = event.target
    var shopItem = btn.parentElement
    var title = shopItem.getElementsByClassName('title')[0].innerText
    var price = shopItem.getElementsByClassName('price')[0].innerText
    var imgSrc = shopItem.getElementsByClassName('Fortnite-Packs-Img')[0].src
    addItemToCart(title, price, imgSrc)
    updateCartTotal()
}

function addItemToCart(title, price, imgSrc) {

    var item = document.createElement('div')
    var cartItems = document.getElementsByClassName('shopping-cart-items')[0]
    var cartItemNames = cartItems.getElementsByClassName('item-name')
    console.log(cartItemNames)
    for(var i = 0; i<cartItemNames.length; i++) {
        if (cartItemNames[i].innerText == title) {
            alert("This item already been added to cart.")
            return
        }
    }
    var cartItemLayout = `
        <div>
        <li class="itemInCart">
            <img class="item-img" src="${imgSrc}" alt="item1" />
            <span class="item-name">${title}</span>
            <span class="item-price">${price}</span>
            <span class="item-quantityword">Quantity: <span class="item-quantity item-quantityword">1</span></span>
            <button class="cartRemovingBtn"><span class="cartRemovingBtntxt">X</span></button>
            </li>
        </div>`
    item.innerHTML = cartItemLayout;
    cartItems.append(item)
    item.getElementsByClassName('cartRemovingBtn')[0].addEventListener('click', removeCartItem)

}


function removeCartItem(event) {
    // what ever button clicked on..
    var removeButtonClicked = event.target
    removeButtonClicked.parentElement.parentElement.remove()
    updateCartTotal()
}


function updateCartTotal() {
    var shoppingCartItems = document.getElementsByClassName('shopping-cart-items')[0]
    var cartItems = shoppingCartItems.getElementsByClassName('itemInCart')
    var itemsCount = cartItems.length
    var total = 0
    for(var i=0; i<cartItems.length;i++) {
        var cartItem = cartItems[i]
        var itemPrice = cartItem.getElementsByClassName('item-price')[0]
        var itemQty = cartItem.getElementsByClassName('item-quantity')[0]
        var price = parseFloat(itemPrice.innerText.replace('$', ''))
        var qty = itemQty.innerText

        total = (total + (price * qty)) *100 / 100 
    }
    document.getElementsByClassName('badge')[0].innerText = itemsCount
    document.getElementsByClassName('badge')[1].innerText = itemsCount
    document.getElementsByClassName('total-price')[0].innerText = '$' + total
    if (total > 0) {
        $(".CheckOutButton").show();
    } else {
        $(".CheckOutButton").hide();
    }

}



【问题讨论】:

  • 使用 localStorage 或 cookie。我更喜欢localStorage。是的,它们可以使用检查进行更改,但用户应该已经更改了购物车中的内容。
  • 由于 cookie 和 localStorage 是客户端,它们可以被篡改。您可能需要考虑使用服务器端解决方案,例如数据库。
  • 这能回答你的问题吗? Persist variables between page loads
  • 如果尝试使用 localStorage 但我真的不明白它将如何在我的购物车上使用,因为当有人点击添加到购物车按钮时,这将调用购物车的 innerHTML 的函数项目在这里和这里我应该放 localStorge.setItem 来获取用户点击的内容,如果我将通过函数外部的 localStorge.getItem 获取项目,然后将其设置为等于 innerHTML,innerHTML 将是未定义的,因为它在功能

标签: javascript refresh cart shopping


【解决方案1】:

您可以使用浏览器historypushStatestate

let myCart = {};
function onLoad() {
  // set cart from state after load
  myCart = history.state || {};
}

function onCartChanged(updatedCart) {
  // push state in history whenever cart is changed
  history.pushState(updatedCart, 'cart');
}

通过以上方式,您可以在刷新时获取当前购物车,也可以通过浏览器返回到上一个购物车。

【讨论】:

  • 嘿,在我的项目中,我应该把这些放在哪里?你可以再详细一点吗?赞赏。
  • 从您给定的代码中,我认为 onLoad 的内容将转到您的 ready 函数,而 onCartChanged 将转到 updateSave。您正在尝试将 html 存储在 localStorage 中,将您的 cartItems 数组保存(推送)到历史记录中。
  • ohmygod updateSave 甚至不应该出现在我的代码中我正在尝试 localStorge 但它不起作用.. 我现在编辑了代码。你能再检查一遍吗?谢谢
  • onCartChanged 将转到您的 updateCartTotal 我敢肯定。根据您存储的内容,我们可以说 cartItems。您将使用 history.state 在页面加载时将其放入 ready() 中,并且您需要从中重新创建 html。
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多