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

Koszyk js frontend

Object Storage Arubacloud
0 głosów
2,064 wizyt
pytanie zadane 4 kwietnia 2018 w JavaScript przez Matisiv Nowicjusz (190 p.)

Mianowicie, chciałbym zrobić koszyk, taki kliknij na jednego diva , pobiera z niego wartość value i dodaje do wartości koszyka, jednocześnie zwiększa liczbę zawartych w nim przedmiotów. Jestem zielony w js więc może mi ktoś podpowiedzieć jak mogę zrobić coś takiego ?  

function doKoszyka()
{
 var cena = document.getElementsByClassName("dodaj").value;
}


Próbowałem przez getElementsByClassName, ale funkcja onclick nie rozpoznaje na jaki obiekt został kliknięty :(

4 odpowiedzi

0 głosów
odpowiedź 4 kwietnia 2018 przez k.wichura Pasjonat (19,870 p.)
wybrane 7 kwietnia 2018 przez Matisiv
komentarz 9 kwietnia 2018 przez Matisiv Nowicjusz (190 p.)
W tym jest tylko jeden problem, mianowicie jak dodaję się więcej produktów to wychodzą duże liczby po przecinku. Np. 287.96999999999997.
komentarz 9 kwietnia 2018 przez k.wichura Pasjonat (19,870 p.)
No to juz wystaraczy zaokraglic, ale z tym juz sobie poradzisz.
komentarz 9 kwietnia 2018 przez Matisiv Nowicjusz (190 p.)
No tak można wykorzystać metodę Math.round(), ale będzie mi to zaokrąglało do pełnej liczby, a ja chce z groszami.
komentarz 9 kwietnia 2018 przez k.wichura Pasjonat (19,870 p.)
Math.round(liczba_z_przecinkiem * 100) / 100;
komentarz 10 kwietnia 2018 przez Matisiv Nowicjusz (190 p.)
Na to samo wychodzi ;( Liczba z przecinkiem jest automatycznie skracana, więc jeśli podstawimy tam .Np. jakieś liczby to: (69,9*100)=6990/100= 69.9.
komentarz 10 kwietnia 2018 przez k.wichura Pasjonat (19,870 p.)
Znasz angielski ? Zapytania google są serio łatwe, a nie każdemu chce się pomagać w tak trywialnych problemach. Obiecuję Ci, że dużo szybciej znajdziesz odpowiedź na swoje pytanie. Na SO były już przerabiane, chyba wszystkie problemy świata.

Spróbuj toFixed(2). Sam nie pamiętam, dawano nie miałem styczności z zaokrąglaneim(ROUND) liczb.
0 głosów
odpowiedź 4 kwietnia 2018 przez Mariusz08 Maniak (62,300 p.)

1.  Zamiast var użyj let/const

2. Aby zwiększać ilość przedmiotów musisz utworzyć zmienną, i później przy dodaniu produktu ją inkrementować (zwiększać wartość o 1)

3. 

document.getElementsByClassName("dodaj").value;

Nie możesz tak zrobić. JS nie wie do czego ma się odnieść, Jeśli już to tak:

document.getElementsByClassName("dodaj")[0].value;

4. Jak funkcja onClick nie rozpoznaje jaki obiekt został kliknięty? Jeśli robisz to w HTML, do funkcji wystarczy podać w argumencie this a w funkcji już sobie z tego pobierać value.

5. Nie korzystaj z onClick, mamy HTML5. Korzystaj z addEventListener

 

komentarz 4 kwietnia 2018 przez Matisiv Nowicjusz (190 p.)

Dziękuję za szybką odpowiedź, ale mam problem z tym że nie pobiera mi z konkretnego buttona. Wyświetla mi tylko value z pierwszego buttona.

<div id="k">Koszyk</div>
<div>95.99zł</div>
    <button class="dodaj" id="1" value="95.99" onclick="koszyk(this)">95.99</button>
<div> 169.99zł</div>
    <button class="dodaj" id="2" value="169.99" onclick="koszyk(this)">Dodaj</button>
<div> 125.99zł</div>
    <button class="dodaj" id="3" value="125.99" onclick="koszyk(this)">Dodaj</button>
<div>525.99zł</div>
    <button class="dodaj" id="4" value="525.99" onclick="koszyk(this)">Dodaj</button>


<script>
function koszyk(){
    let item;
let cena = document.getElementsByClassName("dodaj")[0].value;
item++;
document.getElementById("k").innerHTML = cena + " ZŁ (" +  item + ")";
}
</script>

Muszę przysiąść do nauki javascriptu, ale mam mało czasu :(

komentarz 5 kwietnia 2018 przez ScriptyChris Mędrzec (190,190 p.)

Wyświetla Ci wartość tylko pierwszego przycisku, ponieważ, mimo że do funkcji koszyk przekazujesz referencję do przycisku, to w funkcji z niej nie korzystasz, a zamiast tego odczytujesz cenę stąd:

let cena = document.getElementsByClassName("dodaj")[0].value;

Powinieneś dodać argument o nazwie np. button i cenę pobrać z jego property value, czyli:

function koszyk( button ) {
    /* ... */

    let cena = button.value;

    /* ... */
}

 

0 głosów
odpowiedź 5 kwietnia 2018 przez CzikaCarry Szeryf (75,340 p.)

Po pierwsze primo to weź zrób własny obiekt / funkcję / typ danych / prototyp, nie wiem jak się to nazywa w JS bo nienawidzę frontendu ale coś się robiło, jak trzeba to trzeba. Mianowicie deklarujesz to w ten sposób:

function Basket(){
   this.products = [];
   this.basketValue = 0;
   

  this.addProductToBasket = function (product) {
     // Tutaj dodawanie produktu do listy, zwiększanie wartości koszyka itd
    }
}

Zrób też podobnie z "product". Bardzo to zwiększy czytelność i łatwość pisania kodu :)

PS. Sorry za złe formatowanie ale pisane z telefonu.

komentarz 5 kwietnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Jeśli już to wg mnie lepiej zrobić klasę, np.:

class Basket {
    constructor () {
        this.products = [];
    }
    addProductToBasket( product ) {
        this.products.push( product );
    }
    getBasketValue() {
        const prices = this.products.map( ({price}) => price );
        return prices.reduce( (p1, p2) => (p1 + p2)/100, 0 );
    }
}

const myBasket = new Basket();

myBasket.addProductToBasket(
    { name: 'produkt A', price: 5000 },
    { name: 'produkt B', price: 4000 },
	{ name: 'produkt C', price: 1000 },
)

myBasket.getBasketValue(); //50

Oczywiście to tylko tak poglądowo, bo w faktycznym kodzie jeśli by pójść w ten sposób to trzeba by zabezpieczyć bezpośrednie modyfikowanie products itp. ale nie chce mi się tutaj bawić np. w settery i gettery.

komentarz 5 kwietnia 2018 przez CzikaCarry Szeryf (75,340 p.)
W sumie to wychodzi prawie na to samo, bo klasy w JS de'facto nie istnieją w takiej samej postaci jak w innych językach, jest to tzw. synactic sugar, kod ten zostaje później zamieniany na mniej więcej taki, jaki napisałem wyzej.
2
komentarz 5 kwietnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Z tym zamienianiem to nie do końca, ale co do klas to się zgadzam. Wg mnie każdy kto chce się bawić JS powinien przede wszystkim poznać dobrze czym są prototypy i po prostu przestawić się na takie myślenie, bez porównywania usilnego do np. PHP, Java itp.

dałem ten przykład dlatego, że wg mnie jest to trochę czytelniejsza forma niż tworzenie funkcji konstruktora i zabezpiecza nas przed paroma rzeczami jak np. wywołanie bez słówka "new". Można to oczywiście okodować, ale w class mamy to jakby od razu (tak w dużym uproszczeniu).

klasy w JS de'facto nie istnieją w takiej samej postaci jak w innych językach

ale będziemy mieć niedługo natywnie wspierane prywatne właściwości :P a tak serio to powiem Ci, że często spotykam się z usilnym porównywaniem np. JS do PHP... co rodzi tylko niepotrzebne problemy. Można co prawda w JS nawet zasymulować interfejsy (Comandeer nawet jakiś czas temu pisał coś o tym na blogu :) ale wszystko oki, dopóki jest to robione świadomie, a nie dlatego "żeby było jak w PHP, Java itp." :)

komentarz 5 kwietnia 2018 przez CzikaCarry Szeryf (75,340 p.)
No tak, zgadzam się, po prostu na codzień programuje w PHP i taka dziwna składnia, to wszystko w JS jest dla mnie dość dziwne. Nie mówię, że z tego powodu JS jest zły, po prostu pisze tak, jak umiem, nie staram się pomoc dla autora mimo, że nie znam za bardzo JS, ale wiem jak bym to okodował PHP, i na wzór tego napisałem to w JS (chyba) :D
komentarz 5 kwietnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)
Powiem Ci, że dla mnie z początku w JS wiele rzeczy wydawało się dziwnych... ale teraz nie wyobrażam sobie zmiany na inny język :)

W PHP troszkę się bawiłem, jeszcze w czasach gdy używało się CodeIgniter i Smarty (teraz chyba Twig jest na topie jeśli dobrze kojarzę wypowiedzi tu z forum), ale jakoś nigdy się z PHP nie polubiliśmy, choć fakt, że obiektówka jest fajna i chyba łatwiej zrozumieć dla początkującego wzorce projektowe właśnie np. na przykładzie PHP, gdzie są interfejsy, klasy abstrakcyjne, cechy itp. itd.
0 głosów
odpowiedź 7 kwietnia 2018 przez Matisiv Nowicjusz (190 p.)
edycja 7 kwietnia 2018 przez Matisiv

Teraz mam tylko jeden problem, gdy wywoływana jest zawartość koszyka i ma się w niej zawierać polski znak to robi krzaka. A w normalnym htmlu mam ustawione kodowanie znaków i wyświetla mi polskie znaki. A i jeszcze jedno, poprzez przetwarzanie danych na dane typu folat w "parseFloat(this.value)". Przy wypisywaniu ucina zera z pełnej liczby. Np. Gdy jest liczba "69.90", to zwraca liczbę "69.9". Jak mógłbym to naprawić ?

function Koszyk(){
const divs = document.getElementsByClassName("obj");
const koszyk = document.getElementById("cash");
let ogolnaCena = 0;
let item = 0;
for(let i=0; i < divs.length; i++) {	
  divs[i].addEventListener('click', dodajDoKoszyka);
}


function dodajDoKoszyka(){
    let cena = parseFloat(this.value) + ogolnaCena;
  item++
  koszyk.innerHTML = `${cena} zł/prod(${item})`;
  ogolnaCena += parseFloat(this.value);  
}
}

Dziękuję wszystkim którzy się zainteresowali tematem, doceniam zaangażowanie :)

Podobne pytania

–1 głos
0 odpowiedzi 604 wizyt
pytanie zadane 21 marca 2020 w JavaScript przez Kacperek Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 628 wizyt
pytanie zadane 1 marca 2019 w JavaScript przez zerakot Obywatel (1,870 p.)
0 głosów
2 odpowiedzi 486 wizyt
pytanie zadane 23 grudnia 2018 w JavaScript przez quentis Początkujący (370 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 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!

...