Javascript 会话存储:意外的值更改
Javascript sessionstorage: unexpected value change
我为我的网站做了一点 "font-size widget"。现在,今天我正在寻找实现 sessionstorage 的方法,这样用户就不必一直点击按钮了。
标准字体大小是 20。现在,我不知道为什么,但有时,只有当我按下按钮 2(具有更大的尺寸)时,该值才变成 20 + 2 => 202。我不知道不知道如何或为什么。
有没有人知道如何提高性能并解决此代码?或者,如果您认为 cookie 是一个更好的主意,我将如何为这段代码实现 cookie?
var currentSize;
function confSize(){
if (sessionStorage.getItem('sessionSize') == ""){
$("#body").css("font-size", "20px");
}
else {
currentSize = sessionStorage.getItem('sessionSize');
$("#body").css("font-size", currentSize + "px");
console.log(sessionStorage.getItem('sessionSize'))
}
$("#button2").click(function(){
if (currentSize == 20){
currentSize = 22;
}
else {
currentSize = currentSize + 2;
}
sessionStorage.setItem('sessionSize', currentSize);
$("#body").css("font-size", currentSize + "px");
});
$("#button").click(function(){
currentSize -= 2;
sessionStorage.setItem('sessionSize', currentSize);
$("#body").css("font-size", currentSize + "px");
});
}
您需要确保正确地将值用作字符串和适当的整数。如果您执行以下操作:
currentSize = currentSize + 2
根据 currentSize
当前是字符串还是整数,您将获得不同的值。如果它是一个字符串,则会出现您注意到的串联问题。
现在,您实际上将这个问题与以下问题结合在一起:当您将整数 currentSize
值插入 sessionStorage
时,会自动进行整数到字符串的转换以进行存储(从技术上讲 .toString()
方法会在您尝试存储的任何内容上调用以确定要存储的字符串值)。您从 sessionStorage
中检索到的内容将始终是一个字符串值,因此在尝试对其进行整数数学运算之前,您需要将其转换回整数。
我建议修改您的代码以明确 strings/integers。这可能看起来像这样:
var currentSize;
function confSize(){
var defaultSize = 20;
var sessionStorageStr = sessionStorage.getItem('sessionSize');
if (sessionStorageStr == ""){
currentSize = defaultSize;
}
else {
currentSize = parseInt(sessionStorageStr);
console.log(currentSize);
}
// no need to repeat this code in both sides of the conditional above
$("#body").css("font-size", currentSize + "px");
$("#button2").click(function(){
// I removed your conditional here, as it really did nothing
currentSize += 2;
sessionStorage.setItem('sessionSize', currentSize);
$("#body").css("font-size", currentSize + "px");
});
$("#button").click(function(){
currentSize -= 2;
sessionStorage.setItem('sessionSize', currentSize);
$("#body").css("font-size", currentSize + "px");
});
}
我为我的网站做了一点 "font-size widget"。现在,今天我正在寻找实现 sessionstorage 的方法,这样用户就不必一直点击按钮了。
标准字体大小是 20。现在,我不知道为什么,但有时,只有当我按下按钮 2(具有更大的尺寸)时,该值才变成 20 + 2 => 202。我不知道不知道如何或为什么。
有没有人知道如何提高性能并解决此代码?或者,如果您认为 cookie 是一个更好的主意,我将如何为这段代码实现 cookie?
var currentSize;
function confSize(){
if (sessionStorage.getItem('sessionSize') == ""){
$("#body").css("font-size", "20px");
}
else {
currentSize = sessionStorage.getItem('sessionSize');
$("#body").css("font-size", currentSize + "px");
console.log(sessionStorage.getItem('sessionSize'))
}
$("#button2").click(function(){
if (currentSize == 20){
currentSize = 22;
}
else {
currentSize = currentSize + 2;
}
sessionStorage.setItem('sessionSize', currentSize);
$("#body").css("font-size", currentSize + "px");
});
$("#button").click(function(){
currentSize -= 2;
sessionStorage.setItem('sessionSize', currentSize);
$("#body").css("font-size", currentSize + "px");
});
}
您需要确保正确地将值用作字符串和适当的整数。如果您执行以下操作:
currentSize = currentSize + 2
根据 currentSize
当前是字符串还是整数,您将获得不同的值。如果它是一个字符串,则会出现您注意到的串联问题。
现在,您实际上将这个问题与以下问题结合在一起:当您将整数 currentSize
值插入 sessionStorage
时,会自动进行整数到字符串的转换以进行存储(从技术上讲 .toString()
方法会在您尝试存储的任何内容上调用以确定要存储的字符串值)。您从 sessionStorage
中检索到的内容将始终是一个字符串值,因此在尝试对其进行整数数学运算之前,您需要将其转换回整数。
我建议修改您的代码以明确 strings/integers。这可能看起来像这样:
var currentSize;
function confSize(){
var defaultSize = 20;
var sessionStorageStr = sessionStorage.getItem('sessionSize');
if (sessionStorageStr == ""){
currentSize = defaultSize;
}
else {
currentSize = parseInt(sessionStorageStr);
console.log(currentSize);
}
// no need to repeat this code in both sides of the conditional above
$("#body").css("font-size", currentSize + "px");
$("#button2").click(function(){
// I removed your conditional here, as it really did nothing
currentSize += 2;
sessionStorage.setItem('sessionSize', currentSize);
$("#body").css("font-size", currentSize + "px");
});
$("#button").click(function(){
currentSize -= 2;
sessionStorage.setItem('sessionSize', currentSize);
$("#body").css("font-size", currentSize + "px");
});
}