2015-12-23 2 views
1

Я делаю игру с html и JavaScript. Система сохранения включена в игру, которую я сделал с помощью localStorage. Когда я открываю html-файл с моего компьютера, все идет хорошо. Все сохраняет в localStorage, и все загружается отлично ... Но когда я загружал файлы на свой сайт, где находится игра. На каждое значение приходит NaN ... Я знаю, что это означает «Не номер», но я не понимаю. Почему это работает на моем компьютере, но не на моем веб-сайте?JavaScript localStorage NaN error

Это экономия и загрузка части игры!

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); 

Я думал, это потому, что я не могу добраться туда localStorage? Пожалуйста, помогите мне, мне это действительно нужно, и я пытался найти ответ в течение нескольких дней.

+1

Что такое питание, деньги и т. Д. когда вы вызываете save? Они даже инициализированы? – ivan

+0

Как вопрос вопроса Ивана - что происходит, когда вы добавляете следующее в начале своей функции loadGame? console.log ('money:', localStorage.getItem («Деньги»)); – Tim

+0

Ну, это экономит каждую секунду? так ли имеет значение, если они вначале бесплодны ни с чем? Все переменные хранятся с номерами ... – TheoDePro

ответ

4

вопрос

Ваш чек, чтобы убедиться, что у вас есть значения LocalStorage недействителен:

if(typeof(localStorage.getItem("game_saved_before")) != undefined){ 

GetItem возвращает null и typeof(null) является object.

Следовательно, все ваши другие вызовы могут оцениваться до parseInt(null), что составляет NaN.

немедленного решения

Прямое исправление будет:

if(localStorage.getItem("game_saved_before") !== null){ 

или:

if(localStorage["game_saved_before"] !== undefined){ 

или:

if(typeof(localStorage.getItem("game_saved_before")) === "string"){ 

Но тогда вы должны убедиться, что вы localStorage.clear() получить избавиться от всех свойств со значениями «NaN».

Добавление 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){ 
... 

Недостатком этого подхода является то, что вы до сих пор экономить вещи по частям, так устаревшие свойства из одной версии могут оказаться сосуществовающими с будущими версиями, если вы не используете removeItem.

+0

Правильно, я понимаю, но что такое правильный код, чтобы убедиться, что у меня есть значения localstorage? Большое спасибо! – TheoDePro

+0

Спасибо! Но теперь он не загружает мои игровые данные, если я перезагружаю свою страницу .... Исходный код: я обновил исходный код в главном вопросе, чтобы вы могли видеть. Я не знаю, где разместить скобки или что-то вроде что ... Извините за все мои вопросы/проблемы – TheoDePro

+0

@TheoDePro ах, я бы хотел выбрать 1 из 3, но вложение их должно было работать и было хорошим тестом. Я написал третий назад и теперь исправил его , Если вы исправите третий (и, возможно, уменьшите его до одного), то я думаю, что он будет работать до тех пор, пока вы устанавливаете значения где-то для новых игр. (Если вы еще не устанавливаете значения для новой игры, тогда другой в load_game был бы естественным темпом, чтобы сделать это.) – lossleader