• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Shopping cart- usunięcie produktu z koszyka

Object Storage Arubacloud
0 głosów
197 wizyt
pytanie zadane 28 maja 2020 w JavaScript przez vishi7 Początkujący (430 p.)
zmienione kategorie 28 maja 2020 przez ScriptyChris
let carts = document.querySelectorAll('.add-cart');
let cartContent = document.querySelector('.products');
let products = [
    {
        name: 'Peper',
        tag: 'peperItem',
        price: 15,
        inCart: 0,
        "id": "1"
    },
    {
        name: 'Strawberries',
        tag: 'strawberriesItem',
        price: 10,
        inCart: 0,
        "id": "2"
    },
    {
        name: 'Green Beans',
        tag: 'greenBeansItem',
        price: 5,
        inCart: 0,
        "id": "3"
    },
    {
        name: 'Juice',
        tag: 'juiceItem',
        price: 20,
        inCart: 0,
        "id": "4"
    }
];

for(let i=0; i < carts.length; i++){
    carts[i].addEventListener('click', ()=> {
        cartNumbers(products[i]);
        totalCost(products[i]);
    });
}

function onLoadCartNumbers(){
    let productNumbers = localStorage.getItem('cartNumbers');

    if(productNumbers){
        document.querySelector('.cart-items').textContent = productNumbers;
    }
}
function cartNumbers(product){
    let productNumbers = localStorage.getItem('cartNumbers');
    productNumbers = parseInt(productNumbers);
    
    if(productNumbers){
        localStorage.setItem('cartNumbers',productNumbers+1);
        document.querySelector('.cart-items').textContent = productNumbers+1;
    } else{
        localStorage.setItem('cartNumbers',1);
        document.querySelector('.cart-items').textContent = 1;
    }
    setItems(product);
}

function setItems(product){
    let cartItems = localStorage.getItem('productsInCart');
    cartItems = JSON.parse(cartItems);

    if(cartItems != null){

        if(cartItems[product.tag] == undefined){
            cartItems = {
                ...cartItems,
                [product.tag]: product
            }
        }
        cartItems[product.tag].inCart += 1;
    }
    else{
        product.inCart = 1;
        cartItems = {
            [product.tag] : product
        }
    }
    localStorage.setItem('productsInCart', JSON.stringify(cartItems));
}

function totalCost(product){
    let cartCost = localStorage.getItem('totalCost');
    
    if(cartCost != null){
        cartCost = parseInt(cartCost);
        localStorage.setItem('totalCost', cartCost + product.price);
    }else {
        localStorage.setItem('totalCost', product.price);
    }
}

function displayCart(){
    let cartItems = localStorage.getItem('productsInCart');
    cartItems = JSON.parse(cartItems);
    let productContainer = document.querySelector('.products');
    let cartCost = localStorage.getItem('totalCost');
    
    if(cartItems && productContainer){
        productContainer.innerHTML = '';
        Object.values(cartItems).map(item => {
            productContainer.innerHTML += `
            <div class="product">
                <i class="fas fa-trash-alt remove-item"></i>
                <img src="./images/${item.tag}.jpg">
                <span>${item.name}</span>
            </div>
            <div class="price">$${item.price},00</div>
            <div class="quantity">
                <i class="fas fa-minus minus-item"></i>
                <span>${item.inCart}</span>
                <i class="fas fa-plus plus-item"></i>
            </div>
            <div class="total">
                $${item.inCart * item.price},00
            </div>
            `
        });
        productContainer.innerHTML += `
            <div class="basketTotalContainer">
            <h4 class="basketTotalTitle>
                Basket total
            </h4>
            <h4 class="basketTotal">
                Your Total
                </br></br>
                $${cartCost},00
            </h4>
        ` 
    }
}
onLoadCartNumbers();
displayCart();

Pomoże ktoś z usunięciem produktu z koszyka poprzez naciśnięcie ikonki fa-trash? Program napisany w Vanilla JS. Z góry dziękuję za pomoc.

komentarz 28 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)

W jakiej formie jest zaimplementowany koszyk na stronie - czy to localStorage i z niego chcesz usunąć konkretny produkt?

komentarz 28 maja 2020 przez vishi7 Początkujący (430 p.)
Tak strona korzysta z localStorage. Chcę usunąć produkt z koszyka i przy tym zaktualizować oczywiście inne rzeczy jak całkowita cena, ilość produktów w koszyku itp...

2 odpowiedzi

0 głosów
odpowiedź 28 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 31 maja 2020 przez vishi7
 
Najlepsza

Usunięcie produktu z localStorage można zrobić analogicznie do funkcji setItems, a może i nawet wewnątrz niej - chociaż wtedy tą funkcję bym podzielił na dwie osobne: addItem i removeItem, które były by wołane przez setItems.

Pobierz produkty z localStorage, sparsuj na obiekt, zaktualizuj odpowiednie dane produktu w aplikacji i na koniec usuń operatorem delete (lub przypisz w to miejsce null) obiekt reprezentujący dany produkt z głównego obiektu (pobranego z localStorage). Na koniec zserializuj całość i umieść w localStorage (tak, jak w 32 linijce).

Jeśli będziesz mieć konkretne pytania, to daj znać.

komentarz 2 lipca 2020 przez vishi7 Początkujący (430 p.)
document.querySelector('body').addEventListener('click', function(event) {
	// event.target is the clicked item
	if (!event.target) { return; }

	// Check if the event.target is a remove button
	if (event.target.matches('.remove-item')) {
		removeItem();
	}
});

const removeItem = (product) => {
    let cartItems = localStorage.getItem("productsInCart");
    let cartNumbers = localStorage.getItem("cartNumbers");
    let totalCost = localStorage.getItem("totalCost");
    cartItems = JSON.parse(cartItems);
    if (cartItems != null) {
        if (cartItems[product.tag] == undefined) {
          cartItems = {
            ...cartItems,
            [product.tag]: product,
          };
        }
        cartItems[product.tag].inCart = null;
      } else {
        product.inCart = 1;
        cartItems = {
          [product.tag]: product,
        };
      }
      localStorage.removeItem(cartItems[product.tag]);
}

Nie wiem za bardzo jak to zrobić żeby usunąć konkretny produkt. Consola wyświetla tag jako undefined. 

komentarz 2 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

W którym miejscu tag jest undefined? Funkcję removeItem wołasz w linii 7 bez żadnego parametru, więc jej argument product powinien być undefined, a zatem przy próbie odczytu jakiegokolwiek property (w tym tag) tego argumentu powinno rzucać błędem.

komentarz 5 lipca 2020 przez vishi7 Początkujący (430 p.)
document.querySelector('body').addEventListener('click', function(event) {
	// event.target is the clicked item
	if (!event.target) { return; }

	// Check if the event.target is a remove button
	if (event.target.matches('.remove-item')) {
		removeItem(product);
	}
});

const removeItem = (product) => {
    let cartItems = localStorage.getItem("productsInCart");
    let cartNumbers = localStorage.getItem("cartNumbers");
    let totalCost = localStorage.getItem("totalCost");
    cartItems = JSON.parse(cartItems);
    if (cartItems != null) {
        if (cartItems[product.tag] == undefined) {
          cartItems = {
            ...cartItems,
            [product.tag]: product,
          };
        }
        cartItems[product.tag].inCart = null;
      } else {
        product.inCart = 1;
        cartItems = {
          [product.tag]: product,
        };
      }
      localStorage.removeItem(cartItems[product.tag]);
}

Ok no tak, lecz gdy wrzucę product jako parametr to wyrzuca błąd że product is not defined w 92 linijce.

komentarz 5 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

W 92 linijce? Powyższy fragment kodu ma 31 linijek. W 7 linijce product może być undefined, bo w callbacku event listenera nie tworzysz tej zmiennej (a zakładam, że ta zmienna nie jest dostępna w wyższych scope'ach).

Jeśli chcesz usunąć produkt, to musisz przekazać albo jego referencję (może da radę dobrać się do niej po event.target), albo indeks (jeśli jest umieszczony na jakiejś liście) lub cokolwiek, po czym można go zidentyfikować i usunąć. Chyba, że traktujesz kolekcję produktów jako kolejkę LIFO/FIFO, to usunąć produkt możesz poprzez użycie metod Array.prototype.[shift/pop] (lub w analogiczny sposób, jeśli to nie są stricte tablice).

0 głosów
odpowiedź 28 maja 2020 przez Tomek Sochacki Ekspert (227,510 p.)
edycja 28 maja 2020 przez Tomek Sochacki
Trzymaj sobie to jako tablice obiektow, wyszukaj z Array.prototype.findIndex w połączeniu  z Array.prototype.splice powinnonwystarczyc w taki najszybszy sposób. Gdzie to zapisujesz nie ma znaczenia, ale LS nie jest dobrym miejscem na takie informacje.

Podobne pytania

0 głosów
0 odpowiedzi 115 wizyt
0 głosów
1 odpowiedź 93 wizyt
+1 głos
0 odpowiedzi 291 wizyt

92,566 zapytań

141,420 odpowiedzi

319,604 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...