Reputation: 41
I am making a game with html and JavaScript. A saving system is included into the game I did this with localStorage. When I open the html file from my computer everything goes fine. Everything saves in localStorage and everything loads perfectly... But when I uploaded the files to my website where the game is located On every value there comes NaN... I know that means Not a Number but I do not get it. Why does this work on my computer but not on my website?
Here is the saving and loading part of the game!
var save_format=1;
function save(){
localStorage.setItem("game_saved_before", save_format);
localStorage.setItem("Money", Money);
localStorage.setItem("DrinksSold", DrinksSold);
localStorage.setItem("Price", Price);
localStorage.setItem("Plants", Plants);
localStorage.setItem("CompetitorBonus", CompetitorBonus);
localStorage.setItem("Meals", Meals);
localStorage.setItem("MealsLeft", MealsLeft);
localStorage.setItem("MealCost", MealCost);
localStorage.setItem("Werknemers", Werknemers);
localStorage.setItem("WerknemerCost", WerknemerCost);
localStorage.setItem("nextCostWerknemer", nextCostWerknemer);
localStorage.setItem("StreetLicenses", StreetLicenses);
localStorage.setItem("StreetLicensesHomeTown", StreetLicensesHomeTown);
localStorage.setItem("StreetLicenseCost", StreetLicenseCost);
localStorage.setItem("nextCostStreetLicense", nextCostStreetLicense);
localStorage.setItem("HigherPriceCost", HigherPriceCost);
localStorage.setItem("nextHigherPriceCost", nextHigherPriceCost);
localStorage.setItem("PlantCost", PlantCost);
localStorage.setItem("nextPlantCost", nextPlantCost);
localStorage.setItem("nextMealCost", nextMealCost);
localStorage.setItem("DestroyCompetitorCost", DestroyCompetitorCost);
}
function load_game(){
if(parseInt(localStorage.getItem("game_saved_before") === save_format){
if(localStorage.getItem("game_saved_before") !== null){
// or:
if(localStorage["game_saved_before"] !== undefined){
// or:
if(typeof(localStorage.getItem("game_saved_before")) !== "string"){
Money = parseInt(localStorage.getItem("Money"));
DrinksSold = parseInt(localStorage.getItem("DrinksSold"));
Price = parseFloat(localStorage.getItem("Price"));
Plants = parseInt(localStorage.getItem("Plants"));
CompetitorBonus = parseInt(localStorage.getItem("CompetitorBonus"));
Meals = parseInt(localStorage.getItem("Meals"));
MealsLeft = parseInt(localStorage.getItem("MealsLeft"));
MealCost = parseInt(localStorage.getItem("MealCost"));
Werknemers = parseInt(localStorage.getItem("Werknemers"));
WerknemerCost = parseInt(localStorage.getItem("WerknemerCost"));
nextCostWerknemer = parseInt(localStorage.getItem("nextCostWerknemer"));
StreetLicenses = parseInt(localStorage.getItem("StreetLicenses"));
StreetLicensesHomeTown = parseInt(localStorage.getItem("StreetLicensesHomeTown"));
StreetLicenseCost = parseInt(localStorage.getItem("StreetLicenseCost"));
nextCostStreetLicense = parseInt(localStorage.getItem("nextCostStreetLicense"));
HigherPriceCost = parseInt(localStorage.getItem("HigherPriceCost"));
nextHigherPriceCost = parseInt(localStorage.getItem("nextHigherPriceCost"));
PlantCost = parseInt(localStorage.getItem("PlantCost"));
nextPlantCost = parseInt(localStorage.getItem("nextPlantCost"));
nextMealCost = parseInt(localStorage.getItem("nextMealCost"));
DestroyCompetitorCost = parseInt(localStorage.getItem("DestroyCompetitorCost"));
}
}
}
}
}
load_game();
setInterval(save,1000);
I have been thinking is it because I can't reach there localStorage? Please help me I really need this and I have been trying to find an answer for days.
Upvotes: 1
Views: 3765
Reputation: 13495
Your check to make sure you have localStorage values is invalid:
if(typeof(localStorage.getItem("game_saved_before")) != undefined){
getItem returns null
and typeof(null)
is object
.
Consequently, all your other calls can evaluate to parseInt(null)
which is NaN
.
A direct fix would be:
if(localStorage.getItem("game_saved_before") !== null){
or:
if(localStorage["game_saved_before"] !== undefined){
or:
if(typeof(localStorage.getItem("game_saved_before")) === "string"){
But then you have to make sure you localStorage.clear()
to get rid of all the properties with values of "NaN".
I think you are already running into issues of old configs that you could avoid by versioning:
var save_format=1; // increment on breaking save format changes
save()
localStorage.setItem("game_saved_before", save_format)
...
load_game()
if(parseInt(localStorage.getItem("game_saved_before")) === save_format){
...
A drawback of this approach is that you are still saving things piecemeal, so legacy properties from one version may end up coexisting with future versions unless you use removeItem
.
Upvotes: 4