@ForSureN1
frontend dev

Корзина работает не корректно JS + LocalStorage?

Добрый день, делаю интернет магазин, у меня имеется товар, по нажатию кнопки он должен попадать на другую страницу в корзину(корзина не выпадающая, а именно отдельная страница). Делал по гайду на ютубе, казалось бы все работает, я уже и обрадовался что впервые без багов, не знаю можно ли назвать это багом конечно, скорее моя неопытность и незнание. Так вот, имеется некий класс js-cart, для него мы добавляем ребенка, и собственно и выводим наш товар из LocalStorage, я для теста добавил на этой же странице этот класс рандомному блоку, и так же добавил этот класс в корзине с готовой версткой заранее. Но если я уберу этот класс со страницы где находится моя кнопка КУПИТЬ, то и работать все перестает вовсе, не понимаю почему. Вот код
function requestCart() {
		const cartDOMElement = document.querySelector('.js-cart')
		const cart = JSON.parse(localStorage.getItem('cart')) || {};

		if(!cartDOMElement) {
			return;
		}

		const renderCartItem = ({articul, name, desc, color, size, price,totalprice, src, quantity}) => {
			const cartItemDOMElement = document.createElement('tr');

			const cartItemTemplate = `
				<tr class="product__item">
					<td class="product__title">
						<a href="#"><img src="${src}"></a>
					</td>
					<td class="product__name">
						<h2>${name}</h2>
						<p>${desc}</p>
					</td>
					<td class="product__size-color">
						<p>${size}</p>
					</td>
					<td class="product__count">
						<p>${quantity}</p>
					</td>
					<td class="product__price">
						<p>${price}</p>
					</td>
					<td class="product__summ">
						<p>${totalprice}</p>
					</td>
					<td class="product__remove">
						<button class="remove buy"><img src="images/remove.svg" alt=""></button>
					</td>
				</tr>
			`;
			cartItemDOMElement.innerHTML = cartItemTemplate;
			cartItemDOMElement.setAttribute('data-product-articul', articul)
			cartItemDOMElement.classList.add('js-cart-item')
			cartDOMElement.appendChild(cartItemDOMElement);
		}

		const saveCart = () => {
			localStorage.setItem('cart', JSON.stringify(cart));
		}

		const updateCart = () => {
			console.log(cart);
			saveCart();
		}

		const deleteCartItem = (articul) => {
			const cartItemDOMElement = cartDOMElement.querySelector(`[data-product-articul="${articul}"]`);
			cartDOMElement.removeChild(cartItemDOMElement);
			delete cart[articul];
			updateCart();
			console.log(cartItemDOMElement)
		}

		const addCartItem = (data) => {
			const {articul} = data;
			cart[articul] = data;
			updateCart();
			renderCartItem(data);
		}


		const getProductData = (productDOMElement) => {
			const name = productDOMElement.getAttribute('data-product-name');
			const desc = productDOMElement.getAttribute('data-product-desc');
			const articul = productDOMElement.getAttribute('data-product-articul');
			const size = productDOMElement.getAttribute('data-product-size');
			const color = productDOMElement.getAttribute('data-product-color');
			const price = productDOMElement.getAttribute('data-product-price');
			const src = productDOMElement.getAttribute('data-product-img');
			const quantity = 1;
			const totalprice = quantity * +(price);
			return  { name, desc, articul, size, color, price, totalprice, src, quantity,};
		}

		const renderCart = () => {
			const ids = Object.keys(cart);
			// console.log(ids);
			ids.forEach((articul) => renderCartItem(cart[articul]));
		};

		const cartInit = () => {
			renderCart();

			document.querySelector('body').addEventListener('click', (e) => {
				const target = e.target;
				if (target.classList.contains('js-buy')) {
					e.preventDefault();
					const productDOMElement = target.closest('.js-product');
					const data = getProductData(productDOMElement);
					addCartItem(data);
				}
				if (target.classList.contains('remove')) {
					e.preventDefault();
					const cartItemDOMElement = target.closest('.js-cart-item');
					const productArticul = cartItemDOMElement.getAttribute('data-product-articul');
					deleteCartItem(productArticul);
				}
			});
		}

		cartInit();
	}

	requestCart();


это страница с корзиной, где написан класс js-cart, туда должен попадать товар
<section class="busket">
			<div class="container">
				<div class="bucket__container content">
					<form action="">
						<table class="product">
							<thead class="product__head">
								<tr>
									<th class="product__title">Товар</th>
									<th class="product__name">&nbsp</th>
									<th class="product__size-color">Размер|Цвет</th>
									<th class="product__count">Количество</th>
									<th class="product__price">Цена</th>
									<th class="product__summ">Итог</th>
									<th class="product__remove">&nbsp</th>
								</tr>
							</thead>
							<tbody class="product__body js-cart">
								
							</tbody>
						</table>

					</form>
				</div>
			</div>
		</section>


Это страница с самим товаром, здесь мы получаем атрибуты по нажатию кнопки
<div class="about-item__specification">
							<div class="about-item__description js-product" data-product-name="Millenia Колье" data-product-desc="Кубический Цирконий Swarovski, Белый" data-product-price="40000" data-product-color="" data-product-size="50" data-product-articul="5552658" data-product-img="images/photo1.jpg">
								<p class="about-item__header">Новинки</p>
								<h3 class="about-item__name">Millenia Колье</h3>
								<p class="about-item__text">Кубический Цирконий Swarovski, Белый</p>
								<p class="about-item__price">40 000 тг</p>
								<div class="about-item__choice-color">
									<p class="color-text">Доступно в четырех расцветках:</p>
									<div class="about-item__color">
										<div class="color__item"><a href="#"><img src="images/col1.svg" alt=""></a></div>
										<div class="color__item"><a href="#"><img src="images/col1.svg" alt=""></a></div>
										<div class="color__item"><a href="#"><img src="images/col1.svg" alt=""></a></div>
										<div class="color__item"><a href="#"><img src="images/col1.svg" alt=""></a></div>
									</div>
									<a href="#" class="about-item__manual">Справочник размеров <img src="images/leftright.svg" alt=""></a>
									<div class="about-item__buy">
										<button class="buy__product buy js-buy">Купить</button>
										<a href="#" class="busket__item"><img src="images/busket.svg" alt=""></a>
										<a href="" class="link__item"><img src="images/link.svg" alt=""></a>
									</div>
									<div class="about-item__characters">
										<div class="characters-name">
											<p>Артикул:</p>
											<p>Коллекция:</p>
											<p>Цвет:</p>
											<p>Размер:</p>
											<p>Материал:</p>
											<p>Страна производства:</p>
										</div>
										<div class="characters-data">
											<p>5552658</p>
											<p>зодиак</p>
											<p>размер</p>
											<p>11х4х1,5 см</p>
											<p>покрытие оттенка розового золата</p>
											<p>Thailand</p>
										</div>
									</div>
								</div>
							</div>
						</div>


а вот здесь я для себя для теста добавил блоку класс js-cart, это на той же странице где и сама кнопка купить, так сказать для того чтобы отслеживать что происходит вообще, и если я вот здесь в этом блоке уберу js-cart, то и в страницу с корзиной он тоже не будет попадать
<section class="description-item">
			<div class="container">
				<div class="description-item__container">
					<div class="description-item__content">
						<div class="description-item__title title__cards">
							Millenia Колье
						</div>
						<div class="description-item__text js-cart">
							Этот кулон имеет эффектную форму восьмиугольника и станет одним из самых часто надеваемых украшений в вашей коллекции. К изящной цепочке с родиевым покрытием прикреплён центральный элемент — прозрачный камень ступенчатой огранки, который движется, отвечая на каждое ваше движение, в обрамлении более мелких камней огранки «бриллиант». Изделие абсолютно универсально. Его можно носить и с белой футболкой, создавая утончённые образы, и сочетать с другими ожерельями и колье, делая свой стиль более эффектным. Это колье принадлежит к семейству Millenia и создано креативным директором Джованной Энгельберт для Collection I.
						</div>
					</div>
				</div>
			</div>
		</section>


Заранее благодарю за помощь и потраченное время.
  • Вопрос задан
  • 246 просмотров
Решения вопроса 1
Krasnodar_etc
@Krasnodar_etc
fundraiseup
Попробуйте вот так:

function requestCart() {
    const cartDOMElement = document.querySelector('.js-cart')
    const cart = JSON.parse(localStorage.getItem('cart')) || {};

    const renderCartItem = ({articul, name, desc, color, size, price,totalprice, src, quantity}) => {
      const cartItemDOMElement = document.createElement('tr');

      const cartItemTemplate = `
        <tr class="product__item">
          <td class="product__title">
            <a href="#"><img src="${src}"></a>
          </td>
          <td class="product__name">
            <h2>${name}</h2>
            <p>${desc}</p>
          </td>
          <td class="product__size-color">
            <p>${size}</p>
          </td>
          <td class="product__count">
            <p>${quantity}</p>
          </td>
          <td class="product__price">
            <p>${price}</p>
          </td>
          <td class="product__summ">
            <p>${totalprice}</p>
          </td>
          <td class="product__remove">
            <button class="remove buy"><img src="images/remove.svg" alt=""></button>
          </td>
        </tr>
      `;
      cartItemDOMElement.innerHTML = cartItemTemplate;
      cartItemDOMElement.setAttribute('data-product-articul', articul)
      cartItemDOMElement.classList.add('js-cart-item')
      cartDOMElement.appendChild(cartItemDOMElement);
    }

    const saveCart = () => {
      localStorage.setItem('cart', JSON.stringify(cart));
    }

    const updateCart = () => {
      console.log(cart);
      saveCart();
    }

    const deleteCartItem = (articul) => {
      const cartItemDOMElement = cartDOMElement.querySelector(`[data-product-articul="${articul}"]`);
      cartDOMElement.removeChild(cartItemDOMElement);
      delete cart[articul];
      updateCart();
      console.log(cartItemDOMElement)
    }

    const addCartItem = (data) => {
      const {articul} = data;
      cart[articul] = data;
      updateCart();
      renderCartItem(data);
    }


    const getProductData = (productDOMElement) => {
      const name = productDOMElement.getAttribute('data-product-name');
      const desc = productDOMElement.getAttribute('data-product-desc');
      const articul = productDOMElement.getAttribute('data-product-articul');
      const size = productDOMElement.getAttribute('data-product-size');
      const color = productDOMElement.getAttribute('data-product-color');
      const price = productDOMElement.getAttribute('data-product-price');
      const src = productDOMElement.getAttribute('data-product-img');
      const quantity = 1;
      const totalprice = quantity * +(price);
      return  { name, desc, articul, size, color, price, totalprice, src, quantity,};
    }

    const renderCart = () => {
      const ids = Object.keys(cart);
      // console.log(ids);
      ids.forEach((articul) => renderCartItem(cart[articul]));
    };

    const cartInit = () => {
      if (cartDOMElement) {
        renderCart();
      }

      document.querySelector('body').addEventListener('click', (e) => {
        const target = e.target;
        if (target.classList.contains('js-buy')) {
          e.preventDefault();
          const productDOMElement = target.closest('.js-product');
          const data = getProductData(productDOMElement);
          addCartItem(data);
        }
        if (target.classList.contains('remove')) {
          e.preventDefault();
          const cartItemDOMElement = target.closest('.js-cart-item');
          const productArticul = cartItemDOMElement.getAttribute('data-product-articul');
          deleteCartItem(productArticul);
        }
      });
    }

    cartInit();
  }

  requestCart();


Если работать не будет, открывайте консоль и смотрите ошибки в браузере
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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