[英]vars not holding proper value after localStorage.getItem('key')
My code works fine up until I try to save my data, exit out, then reopen then load saved data. 我的代码可以正常工作,直到尝试保存我的数据,退出,然后重新打开然后加载保存的数据。 I save using localStorage.setItem('key', value) then I load using localStorage.getItem('key'), but after I load my vars are not holding the right values. 我使用localStorage.setItem('key',value)保存,然后使用localStorage.getItem('key')进行加载,但是加载后,我的var没有保存正确的值。 Is localStorage.getItem('key') returning a string, because 1 +1 = 2, not 11 like it's displaying. 是localStorage.getItem('key')返回一个字符串,因为1 +1 = 2,而不是显示的11。 please help. 请帮忙。
The page itself is stored on my PC not online, I'm opening it up with Google Chrome. 该页面本身存储在我的PC上,而不在线存储,我正在使用Google Chrome浏览器打开它。 I run Windows Edge. 我运行Windows Edge。 When I try opening this with Internet Explorer, forget about localStorage.set/getItem all together. 当我尝试使用Internet Explorer打开此文件时,完全忘记了localStorage.set / getItem。 I've tried just running my code with the variables then try to save and load. 我试过只使用变量运行代码,然后尝试保存和加载。 (note:All my code works flawlessly until I try to save the variables, then reload them). (注意:在尝试保存变量,然后重新加载它们之前,我的所有代码都可以正常工作)。 I'm working on a video game so I need to be able to save my variables. 我正在制作视频游戏,所以我需要能够保存变量。 And since I'm not sure where the problem in my code lies, I'm sorry but I see no other option than to post about 180 lines of code 而且,由于我不确定代码中的问题在哪里,很抱歉,但是除了发布大约180行代码外,我没有其他选择
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body bgcolor="black" >
<font color="white" >
<progress id="myProgress" value="10" max="10"></progress><br>
<p id='demo5' ;></p>
<button id="enemy" type="button" onclick="dealDamage(), imageSwap()"><img
id="enemy1" src="Game_Images/smiley_1.png"></button>
<button id="spriteTest" type="button" onclick="imageSwap2()"><img
id="enemy2" src="Game_Images/smiley_1.png"></button><br>
<button id="upgrade" type="button" onclick="upgradeClickDamage()">
</button>
<button type="button" onclick="moreGold()">More Gold</button><br>
<button type="button" onclick="saveGame()">Save Game</button>
<button type="button" onclick="loadGame()">Load Game</button>
<p id='demo' ;></p>
<p id='demo2' ;></p>
<p id='demo3' ;></p>
<p id='demo4' ;></p>
<script>
var clickDamage = 1;
var gold = 0;
var stage = 1;
var enemyNum = 1;
var enemiesTotal = 10;
var enemiesKilled = 0;
var cost = 100;
var enemyHPTotal = 10;
var enemyHPCurrent = 10;
document.getElementById("upgrade").innerHTML = "Upgrade click damage for:"
+ cost + " gold.";
document.getElementById("demo").innerHTML = "Gold: " + gold;
document.getElementById("demo2").innerHTML = "Stage: " + stage;
document.getElementById("demo3").innerHTML = "Enemies Killed This Stage:"
+ enemiesKilled + "/" + enemiesTotal;
document.getElementById("demo4").innerHTML = "Click Damage:" +
clickDamage;
document.getElementById("demo5").innerHTML = "Enemy HP remaining:" +
enemyHPCurrent + "/" + enemyHPTotal;
function imageSwap() {
var image = document.getElementById("enemy1");
if (image.src.match("Game_Images/smiley_1")){
image.src="Game_Images/smiley_2.png"
}
else if (image.src.match("Game_Images/smiley_2")){
image.src="Game_Images/smiley_3.png"
}
else {
image.src="Game_Images/smiley_1.png"
}
}
function imageSwap2(){
var image2 = document.getElementById("enemy2");
if(image2.src.match("Game_Images/smiley_1")){
setTimeout(image2.src="Game_Images/smiley_2.png", 300);
}
else if(image2.src.match("Game_Images/smiley_2")){
setTimeout(image2.src="Game_Images/smiley_3.png", 300);
}
else {
setTimeout(image2.src="Game_Images/smiley_1.png", 300);
}
}
function dealDamage() {
document.getElementById("myProgress").value -= clickDamage;
//If enemy is hit but does not die
if(document.getElementById("myProgress").value >= 1){
enemyHPCurrent = document.getElementById("myProgress").value
enemyHPTotal = document.getElementById("myProgress").max
document.getElementById("demo5").innerHTML = "Enemy HP remaining:"
+ enemyHPCurrent + "/" + enemyHPTotal;
}
//If enemy is killed and there are remaining enemies in the current stage
if (document.getElementById("myProgress").value == 0 && enemyNum < 10) {
document.getElementById("myProgress").value =
document.getElementById("myProgress").max;
gold += (1 * stage);
enemyHPTotal = document.getElementById("myProgress").value;
enemyNum += 1;
document.getElementById("demo").innerHTML = "Gold: " + gold;
document.getElementById("demo2").innerHTML = "Stage: " + stage;
enemiesKilled += 1;
document.getElementById("demo3").innerHTML = "Enemies Killed This
Stage:" + enemiesKilled + "/" + enemiesTotal;
document.getElementById("demo4").innerHTML = "Click Damage:" +
clickDamage;
enemyHPCurrent = enemyHPTotal;
document.getElementById("demo5").innerHTML = "Enemy HP remaining:"
+ enemyHPCurrent + "/" + enemyHPTotal;
}
//If the enemy is killed and it is the last enemy of the current stage
if (document.getElementById("myProgress").value == 0 && enemyNum == 10) {
document.getElementById("myProgress").max += 1;
document.getElementById("myProgress").value =
document.getElementById("myProgress").max;
gold += (1 * stage);
enemyNum = 1;
stage += 1;
document.getElementById("demo").innerHTML = "Gold: " + gold;
document.getElementById("demo2").innerHTML = "Stage: " + stage;
enemiesKilled = 0;
document.getElementById("demo3").innerHTML = "Enemies Killed This
Stage:" + enemiesKilled + "/" + enemiesTotal;
document.getElementById("demo4").innerHTML = "Click Damage:" +
clickDamage;
enemyHPTotal = document.getElementById("myProgress").max;
enemyHPCurrent = enemyHPTotal;
document.getElementById("demo5").innerHTML = "Enemy HP remaining:"
+ enemyHPCurrent + "/" + enemyHPTotal;
}
}
function upgradeClickDamage() {
if (gold >= cost) {
gold -= cost;
clickDamage += 1;
cost += 100;
document.getElementById("messageBox").innerHTML =
"Congratulations!!! You just upgraded your click damage."
document.getElementById("upgrade").innerHTML = "Upgrade click damage
for:" + cost + " gold.";
document.getElementById("demo").innerHTML = "Gold: " + gold;
document.getElementById("demo4").innerHTML = "Click Damage:" +
clickDamage;
}
else if (gold < cost) {
document.getElementById("messageBox").innerHTML = "You don't have
enough gold for this upgrade."
}
}
function moreGold() {
gold += 100;
document.getElementById("demo").innerHTML = "Gold: " + gold;
}
function saveGame(){
//save all vars
localStorage.setItem('CLICKDAMAGE', clickDamage);
localStorage.setItem('GOLD', gold);
localStorage.setItem('STAGE', stage);
localStorage.setItem('ENEMYNUM', enemyNum);
localStorage.setItem('ENEMIESTOTAL', enemiesTotal);
localStorage.setItem('ENEMIESKILLED', enemiesKilled);
localStorage.setItem('COST', cost);
localStorage.setItem('ENEMYHPTOTAL', enemyHPTotal);
localStorage.setItem('ENEMYHPCURRENT', enemyHPCurrent);
}
function loadGame(){
//load all vars
clickDamage = localStorage.getItem('CLICKDAMAGE');
gold = localStorage.getItem('GOLD');
stage = localStorage.getItem('STAGE');
enemyNum = localStorage.getItem('ENEMYNUM');
enemiesTotal = localStorage.getItem('ENEMIESTOTAL');
enemiesKilled = localStorage.getItem('ENEMIESKILLED');
cost = localStorage.getItem('COST');
enemyHPTotal = localStorage.getItem('ENEMYHPTOTAL');
enemyHPCurrent = localStorage.getItem('ENEMYHPCURRENT');
}
</script>
<div id="messageBox"></div>
</font>
</body>
</html>
I expected all variables to function properly after loading. 我希望所有变量在加载后都能正常运行。 gold, cost, and enemiesKilled are all affected by this same problem. 黄金,成本和敌人杀戮都受此问题影响。 If gold = 1, and I save that variable then load that variable later, then add 1 again, I get 11, not 2. With cost, if cost = 100, then I save, then I load later, then I add 100 to cost, cost = 100100 not 200. 如果gold = 1,然后保存该变量,然后再加载该变量,然后再次加1,则得到11,而不是2。对于cost,如果cost = 100,则保存,然后再加载,然后将100加到费用,费用= 100100而不是200。
(This will restate a bit of what you hypothesized in your question for the sake of completeness) (为了完整起见,这将重述您在问题中假设的内容)
If you look at the documentation for Storage.getItem()
, it says: 如果查看Storage.getItem()
的文档,它将显示:
Return value 返回值
ADOMString
containing the value of the key. 包含键值的DOMString
。 If the key does not exist, null is returned. 如果键不存在,则返回null。
This means that no matter what data type you give in setItem
, the output of getItem
will always be a string. 这意味着无论您在setItem
提供哪种数据类型, getItem
的输出将始终是字符串。 This is easy to test in the console: 这很容易在控制台中测试:
localStorage.setItem("test", 1);
> undefined
localStorage.getItem("test");
> "1"
When you add a string to a number, it just concatenates the two together. 将字符串添加到数字时,它只是将两者串联在一起。 In your case, you're adding "1" + 1
which becomes "11"
instead of adding 1 + 1
which would be 2
. 在您的情况下,您要添加"1" + 1
变为"11"
而不是添加1 + 1
等于2
。 The solution is to convert the number string into a number, which can be done several ways, but is easiest to do (in my opinion) by simply prefixing the expression with a +
. 解决方案是将数字字符串转换为数字,这可以通过几种方法完成,但最简单的方法是(在我看来),只需在表达式前面加上+
。
+localStorage.getItem("test");
> 1
The localStorage.setItem
converts all passed values to string. localStorage.setItem
将所有传递的值转换为字符串。 Once you call localStorage.getItem
you are getting back string value. 调用localStorage.getItem
您将返回字符串值。
So you are trying to concatenate string and number "1" + 1 === "11"
. 因此,您尝试将字符串和数字"1" + 1 === "11"
。
To prevent this behavior you need to manually convert values to stringified JSON: 为防止此行为,您需要手动将值转换为字符串化的JSON:
localStorage.setItem('CLICKDAMAGE', JSON.stringify(clickDamage));
And then parse it back: 然后解析回去:
clickDamage = JSON.parse(localStorage.getItem('CLICKDAMAGE'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.