Я создаю корзину для веб-сайта электронной коммерции и хочу хранить продукты в локальном хранилище браузера.
Я внедрил в свой код следующие функции для добавления и извлечения продуктов.
addToCart() — это функция, которая запускается каждый раз, когда нажимается кнопка «Добавить в корзину».
addProduct() добавляет каждый товар в корзину.
getProductsFromLocalStorage() извлекает продукты из localStorage и добавляет продукты в корзину.
function addToCart(trigger) {
var cartIsEmpty = cartWrapper.hasClass('empty');
//get localstorage cart product list
getProductsFromLocalStorage();
//update cart product list
addProduct();
//update number of items
updateCartCount(cartIsEmpty);
//update total price
updateCartTotal(trigger.data('price'), true);
//show cart
cartWrapper.removeClass('empty');
}
function addProduct() {
productId = productId + 1;
var productName = document.getElementById('reebok').innerHTML;
var productPrice = document.getElementById('p_price').getAttribute('data- value');
var image = document.getElementById("main_img").src;
var productSize = document.getElementById('size').value;
var productColor = document.getElementById('color').value;
value = parseFloat(productPrice).toFixed(2);
var productAdded = $('<li class = "product"><div class = "product-image"><a href = "#0"><img src = "'+ image +'" alt = "placeholder"></a></div><div class = "product-details"><h3><a href = "#0">' + productName + '</a></h3><span class = "price">'+ productPrice +'</span><div class = "actions"><a href = "#0" class = "delete-item">Delete</a><a class = "delete-item">'+ productSize +'</a><a class = "delete-item">'+ productColor +'</a><div class = "quantity"><label for = "cd-product-' + productId + '">Qty</label><span class = "select"><select id = "cd-product-' + productId + '" name = "quantity"><option value = "1">1</option><option value = "2">2</option><option value = "3">3</option><option value = "4">4</option><option value = "5">5</option><option value = "6">6</option><option value = "7">7</option><option value = "8">8</option><option value = "9">9</option></select></span></div></div></div></li>');
cartList.append(productAdded);
let products = [{'productId' : productId + 1, image : image, name : productName, price: productPrice, size: productSize, color: productColor}];
localStorage.setItem('products', JSON.stringify(products));
}
function getProductsFromLocalStorage() {
const cs = localStorage.getItem('products');
if (cs === null) {
addProduct();
} else {
$.each(cs.products, function(key, value) {
cartList.prepend($('<li class = "product"><div class = "product-image"><a href = "#0"><img src = "'+ value.image +'" alt = "placeholder"></a></div><div class = "product-details"><h3><a href = "#0">' + value.name + '</a></h3><span class = "price">${value.price}</span><div class = "actions"><a href = "#0" class = "delete-item">Delete</a><a class = "delete-item">' + value.size + '</a><a class = "delete-item">' + value.color + '</a><div class = "quantity"><label for = "cd-product-' + value.productId + '">Qty</label><span class = "select"><select id = "cd-product-' + value.productId + '" name = "quantity"><option value = "1">1</option><option value = "2">2</option><option value = "3">3</option><option value = "4">4</option><option value = "5">5</option><option value = "6">6</option><option value = "7">7</option><option value = "8">8</option><option value = "9">9</option></select></span></div></div></div></li>'));
});
}
}
Теперь у меня возникла проблема с тем, что я не могу получить элементы корзины из локального хранилища и добавить их в корзину с новыми элементами. Это означает, что элементы корзины сохраняются в хранилище, но я вижу пустую корзину, когда пытаюсь добавить новые элементы, как показано ниже:
Демонстрация этого кода находится по адресу https://codyhouse.co/demo/add-to-cart-interaction/index.html.
Спасибо за любую помощь,
Джеймс.
Здравствуйте, Винит, я добавил дополнительную информацию к моему вопросу. Кажется, я не могу вернуть предметы из локального хранилища. Код для моих функций обновлен в вопросе выше. Большое спасибо за любую помощь, которую вы можете предоставить.
Вы сохраняете продукты в локальном хранилище в виде строки JSON, но при повторном получении вы не анализируете продукты. Что вы должны сделать, это JSON.parse(localStorage.getItem('products')). Проверьте этот рабочий пример



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте этот пакет javascript для хранения любых данных в indexDB браузера, чтобы данные сохранялись после перезагрузки. местный корм
Зачем использовать пользовательскую библиотеку, когда доступно локальное хранилище браузера? См.: developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
Localstorage позволяет хранить только строки, я предполагаю, что ваша корзина является объектом. localforage — хороший пакет для хранения объектов.
Конечно. Однако вы можете хранить объекты в виде строк JSON.
Localforage оптимизирован для использования других сред, таких как indexDB, а не localstorage для хранения данных, в зависимости от типа данных, которые вы ему передаете. каждая из этих сред (indexDB, WebSQL и localstorage) имеет свои преимущества.
Привет, Спанки, на самом деле я пытаюсь хранить продукты в локальном хранилище браузера, как сказал Винит.
Вы должны использовать для этого локальное хранилище браузера.
В вашей функции addProduct вы должны добавить массив продуктов в элемент локального хранилища, скажем products; вот так:
function addProduct(){
let products = [];
if (localStorage.getItem('products')){
products = JSON.parse(localStorage.getItem('products'));
}
products.push({'productId' : productId + 1, image : '<imageLink>'});
localStorage.setItem('products', JSON.stringify(products));
}
Если вы хотите удалить продукт, вы можете сделать это следующим образом:
function removeProduct(productId){
// Your logic for your app.
// strore products in local storage
let storageProducts = JSON.parse(localStorage.getItem('products'));
let products = storageProducts.filter(product => product.productId !== productId );
localStorage.setItem('products', JSON.stringify(products));
}
Пожалуйста, проверьте этот рабочий пример для рабочей демонстрации.
Спасибо за ответ, Винит, я обновил свой код, чтобы установить локальное хранилище с массивом моих продуктов. Буду ли я использовать localStorage.get для извлечения содержимого переменной localstorage при обновлении страницы? Спасибо еще раз.
да. localStorage.getItem('<whatever_the_name>').
Спасибо за демонстрацию скрипки, я не знал, что могу проверить вкладку «Приложение» в инструментах разработки, чтобы увидеть функцию в действии. Проблема решена!
См. developer.mozilla.org/en-US/docs/Web/API/Window/localStorage