Permalänk

"push" fungerar inte property?

Hej!

Sitter och gör ett quiz, som egentligen är färdigt.

Men problemet är att när man gjort färdigt alla frågor så ska highscore topp5 lista dyka upp vilket det har gjort tidigare, men har nu försvunnit.

Provade localStorage.clear() snabbt för att se om man kunde "tömma" topp 5 listan.

men efter detta så försvann listan

https://jsfiddle.net/9cavt9xr/

där är all kod. jag får detta svaret när jag inspekterar allt.

app.js?3330:69 Uncaught (in promise) TypeError: Cannot read property 'push' of null at saveScore (app.js?3330:69) at HTMLButtonElement.sendAnswer (app.js?3330:178)

vilket pekar på

highScore.push(score)

och

if (jsonA.nextURL !== undefined) { questionURL = jsonA.nextURL } else { quizCompleted() saveScore() quizScore() } } else {

det pekar alltså på "push" i saveScore function och saveScore i else satsen.

Vad är felet, varför vill inte topp 5 listan dyka fram nu?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

Inte så mycket hjälp kanske, men variabeln highScore verkar vara null, så kolla var/hur du plockar fram den.

Har inte läst igenom hela din kod, jag utgår bara från vad jag ser i ditt inlägg.

Visa signatur

5950X, 3090

Permalänk
Medlem

Som @backfeed säger highScore är null, den försöker hämta något ifrån localStorage som inte finns.

highScore = JSON.parse(window.localStorage.getItem('highScorePanel')

Här kan dock felet vara:

let highScore = [] highScore = JSON.parse(window.localStorage.getItem('highScorePanel'))

highScore kan bli null eftersom window.localStorage.getItem returnerar det, du bör skriva som detta:

let highScore = JSON.parse(window.localStorage.getItem('highScorePanel')) || []

Om värdet som hämtas ifrån localStorage är null så blir highScore en tom array som du sedan kan populera med värden.

Permalänk
Skrivet av backfeed:

Inte så mycket hjälp kanske, men variabeln highScore verkar vara null, så kolla var/hur du plockar fram den.

Har inte läst igenom hela din kod, jag utgår bara från vad jag ser i ditt inlägg.

let highScore = [] highScore = JSON.parse(window.localStorage.getItem('highScorePanel')) function saveScore() { let score = { smeknamn: name, tid : totaltime } highScore.push(score) localStorage.setItem('highScorePanel', JSON.stringify(highScore)) }

så ser det ut med highscore, vet du varför det blir null?

sorry, skrev detta preics efter jag fick det senaste svaret!

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

@Howardtheory: Men highscore data sparat lokalt i browsern, så är ju mer "your best" än något annat

Permalänk
Inaktiv

@Howardtheory: Det du gör är ju att först deklarera [], för att sedan direkt skriva över den.

Du vill ju inte skriva över din variabel om datan inte finns!

let highScore = [] const storedScore = window.localStorage.getItem('highScorePanel') if (storedScore != null && storedScore !== "") { highScore = JSON.parse(storedScore) } // kod...

Permalänk
Medlem

@anon81912: Enklast är la att göra det på en rad om man ändå inte tänker validera datan ifrån localStorage.

let highScore = JSON.parse(window.localStorage.getItem('highScorePanel')) || []

Permalänk
Inaktiv
Skrivet av gonace:

@Killbom: Enklast är la att göra det på en rad.

let highScore = JSON.parse(window.localStorage.getItem('highScorePanel')) || []

Ja, absolut! Det är dock lite mer svårläst och jag kände inte att det var något som behövdes just nu

Permalänk
Medlem

@anon81912: Absolut, du har en poäng i det.

Permalänk

@gonace:

tack som fasen båda två det löste sig nu, stort tack!

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk

Tack alla för svaren! Hjälpte mig mycket!

Visa signatur

Big Bang Theory
Howard Wolowitz