Задать вопрос
@helpmeplease196

Как сохранить в localStorage объект, хранящий данные о HTML?

Делаю учебный проект, есть корзина: при клике разметка HTML с товаром дублируется в корзину. Сама корзина работает так как и должна. Но не могу сохранить данные в localStorage.
Как только сохраняю переменную, хранящую в себе данные о товаре, возникает ошибка на следующей строке, переменная, взятая из localStorage после сохранения не распознается.

Можно ли вообще сохранять переменную с данными о разметке в LocalStorsge?
Как правильно проиписывать корзину с учетом сохранения в localStorage?

PS. понимаю, что код может выглядит кривым и нелогичным, постепенно пытаюсь его исправлять.
Ссылка на CodePen не очень информативна, так как JSON с информацией о товаре хранится на компьютере и не отображаются корректно.
В гугл много статей о корзинах, но почти все на фреймворках.
Все что связано с корзиной начинается с 53 строки.

let nav = document.querySelector("nav")
let menu =document.querySelectorAll("a")
let body=document.querySelector("body")
let checkbox_line=document.querySelector("checkbox-line")
let wrap = document.querySelector(".wrapper") 
let shoppingBasket= document.querySelector(".basket") 
let priceArr=[]

window.addEventListener('scroll', function(){
    if(body.clientWidth>=900){ 
    if(window.pageYOffset>1){
        nav.style.backgroundColor="white";
        menu.forEach((element =>element.style.color="black"))
        nav.style.color="black"
        nav.style.boxShadow="0px 2px 15px rgb(217, 205, 205)"
    }else{
        nav.style.backgroundColor="transparent";
        menu.forEach((element =>element.style.color="white"))
        nav.style.color="white"
        nav.style.boxShadow="none"
}}}
)
 let nameBlock
function getXMLHttpRequest(url,nameBlock,classNameBlock ){
    const reguest=url
const xhr = new XMLHttpRequest()
nameBlock  = document.querySelector(classNameBlock)
xhr.open("GET", reguest)
xhr.responseType="json"
xhr.onload = function() {
   let response=xhr.response
   for(let key in response){
    nameBlock.innerHTML+=`
       <div class="product-item" data-id="${response[key].id}">
       <div class="img-wrap">
       <img class="product-photo" src="${response[key].img}" alt="foto">
       </div>
           <h3 class="product-name">${response[key].name}</h3>
             <span class="price"> ${response[key].price} ₽</span>
             <button  class="add-product" >добавить</button>
   </div>` 
   }
 }
xhr.send()
}

getXMLHttpRequest("./cake/cake.json","list",".catalog-cake-box" )
getXMLHttpRequest("./tiered-cake/tiered-cake.json","list",".catalog-tiered-box" ) 
getXMLHttpRequest("./pastry/pastry-cake.json","list",".catalog-pastry-box" ) 
getXMLHttpRequest("./gift/gift.json","list",".catalog-gift-box" )


wrap.addEventListener("click", function(e){   // блок с корзиной
    let targetElement = e.target
    if(targetElement.classList.contains("add-product")) {
    let productId=targetElement.closest(".product-item").dataset.id
    let product = document.querySelector(`[data-id="${productId}"]`)

   localStorage.setItem('product', JSON.stringify(product))
   product = JSON.parse(localStorage.getItem('product'))


    if(!product.classList.contains("hold")){
        let productCopy=product.cloneNode(true)
        alert(typeof productCopy )
        let sumPriceHTML=document.querySelector(".sum-price")
        shoppingBasket.insertBefore(productCopy,sumPriceHTML)
        let addProductBtn=productCopy.querySelector(".add-product")
        addProductBtn.remove()
        productCopy.classList.add("productCopy")
 let ptoductImgCopy=productCopy.querySelector(".img-wrap")
ptoductImgCopy.classList.add("ptoductImgCopy")
let productNameCopy=productCopy.querySelector(".product-name")
productNameCopy.classList.add("productNameCopy")
let productPriceCopy=productCopy.querySelector(".price")
productPriceCopy.classList.add("productPriceCopy")
let btnPlus=document.createElement("button")
btnPlus.innerHTML="+"
btnPlus.classList.add("btnPlusMinus")
productNameCopy.appendChild(btnPlus)
let btnMinus=document.createElement("button")
btnMinus.innerHTML="-"
btnMinus.classList.add("btnPlusMinus")
productNameCopy.appendChild(btnMinus)
let counterHTML=document.createElement("p")
counterHTML.classList.add("counter")
productNameCopy.appendChild(counterHTML)
let strPrice =productPriceCopy.textContent;
let numPrice= parseInt(strPrice,10)
priceArr.push(numPrice)
let sumPriceArr=priceArr.reduce(function(prew, item){
    return prew + item
},0)
sumPriceHTML.innerHTML=`Итого:  ${sumPriceArr} `
let btnCounter=1
btnPlus.addEventListener("click", function(){
    priceArr.push(numPrice)
     sumPriceArr=priceArr.reduce(function(prew, item){
        return prew + item
    },0)
    btnCounter++
    sumPriceHTML.innerHTML=` Итого:  ${sumPriceArr} `
counterHTML.innerHTML=`${btnCounter}`
}
)
btnMinus.addEventListener("click", function(){
    i = priceArr.indexOf(numPrice);
    if(i >= 0) {priceArr.splice(i,1)}
     sumPriceArr=priceArr.reduce(function(prew, item){
        return prew + item
    },0)
    btnCounter--
    sumPriceHTML.innerHTML=` Итого:  ${sumPriceArr} `
counterHTML.innerHTML=`${btnCounter}`
if(btnCounter==0){
    productCopy.remove()}
    product.classList.remove("hold")
}
)
        }
        product.classList.add("hold")
}}

)

  <codepen src="https://codepen.io/anna55498489/pen/vYaYELJ"/>
  • Вопрос задан
  • 225 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
SagePtr
@SagePtr
Еда - это святое
Разметку сохранять не надо, только данные. Разметка должна генерироваться из этих данных. А можно вообще хранить в корзине только id'шники, а с сервера запрашивать по ним информацию.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Kryptonit
JSON.stringify() обычно используют для преобразования в JSON js объектов, вы пытаетесь преобразовать nodelist,
попробуйте лучше вместо этого способа поместить в localStorage сам html через innerHTML, а лучше всего создать шаблон-html в localStorage, в котором просто будут каждый раз изменяться значения. Подробнее о JSON
https://learn.javascript.ru/json
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы