如何在设置本地存储之前设置预定义密钥?
How do i set a predefined key before local-storage is set?
我有一个热键,可以单击页面上的元素并使用默认键 'r'。我还有一个输入,允许在输入一个键时更改热键。当输入一个值时,它被缓存到本地存储。唯一的问题是默认键不适用于事件,仅当输入设置为一个值时才起作用。
let IsInputing = true
let key = 82
setTimeout(() => {
key = localStorage.getItem('savedKey');
input.onchange = function(){
localStorage.setItem('savedKey', key)
}
window.addEventListener("keydown", activate, false);
function activate(key) {
if (IsInputing == false) {
if (key.keyCode == key) {
console.log('key pressed')
element.click();
}
}
}
input.onkeydown = function (key) {
IsInputing = true
key = key.keyCode;
console.log('key changed')
setTimeout(changeKey, 1000)
}
function changeKey() {
IsInputing = false;
}
}, 500);
您的问题是,第一次运行代码时,您将 key
设置为 82
,然后将其设置为任何 localStorage.getItem
returns,如果没有缓存(第一次),它将 return null
。
let key = 82;
setTimeout(() => {
key = localStorage.getItem('savedKey');
});
这意味着您的代码本质上是:
key = 82;
setTimeout(() => {
key = null; // <-- you overwrite the key with null on the first run
});
仅当 localStorage
没有先前缓存的值时才尝试为 key
设置默认值:
let DEFAULT_KEY = 82;
setTimeout(() => {
key = localStorage.getItem('savedKey') || DEFAULT_KEY;
});
或更简洁地说:
setTimeout(() => {
key = localStorage.getItem('savedKey') || 82;
});
注意:为了避免一些潜在的未来错误,您可能希望在 return 时将缓存值转换为数字(localStorage
仅保存字符串)。
key = Number(localStorage.getItem('savedKey'));
或者使用字符串作为默认值。
let DEFAULT_KEY = '82';
setTimeout(() => {
key = localStorage.getItem('savedKey') || DEFAULT_KEY;
});
具有一致的类型可以避免意外比较等错误:
'82' == 82 // true
'82' === 82 // false
正如我的回答的评论中提到的,您在 activate
函数中还有另一个错误。
您将 activate
的参数命名为 key
,这将在您进行 key.keyCode == key
比较时隐藏全局 key
变量。
function activate(key) {
// ^^^ you are using the same name as the global key
if (IsInputing == false) {
if (key.keyCode == key) {
console.log('key pressed')
element.click();
}
}
}
如果 activate
中的 key
例如 'abcd'
,您的代码将执行 'abcd'.keyCode == 'abcd'
。
解决它的一种方法是重命名 activate
的参数:
function activate(activationKey) {
if (IsInputing == false) {
if (activationKey.keyCode == key) {
console.log('key pressed')
element.click();
}
}
}
我有一个热键,可以单击页面上的元素并使用默认键 'r'。我还有一个输入,允许在输入一个键时更改热键。当输入一个值时,它被缓存到本地存储。唯一的问题是默认键不适用于事件,仅当输入设置为一个值时才起作用。
let IsInputing = true
let key = 82
setTimeout(() => {
key = localStorage.getItem('savedKey');
input.onchange = function(){
localStorage.setItem('savedKey', key)
}
window.addEventListener("keydown", activate, false);
function activate(key) {
if (IsInputing == false) {
if (key.keyCode == key) {
console.log('key pressed')
element.click();
}
}
}
input.onkeydown = function (key) {
IsInputing = true
key = key.keyCode;
console.log('key changed')
setTimeout(changeKey, 1000)
}
function changeKey() {
IsInputing = false;
}
}, 500);
您的问题是,第一次运行代码时,您将 key
设置为 82
,然后将其设置为任何 localStorage.getItem
returns,如果没有缓存(第一次),它将 return null
。
let key = 82;
setTimeout(() => {
key = localStorage.getItem('savedKey');
});
这意味着您的代码本质上是:
key = 82;
setTimeout(() => {
key = null; // <-- you overwrite the key with null on the first run
});
仅当 localStorage
没有先前缓存的值时才尝试为 key
设置默认值:
let DEFAULT_KEY = 82;
setTimeout(() => {
key = localStorage.getItem('savedKey') || DEFAULT_KEY;
});
或更简洁地说:
setTimeout(() => {
key = localStorage.getItem('savedKey') || 82;
});
注意:为了避免一些潜在的未来错误,您可能希望在 return 时将缓存值转换为数字(localStorage
仅保存字符串)。
key = Number(localStorage.getItem('savedKey'));
或者使用字符串作为默认值。
let DEFAULT_KEY = '82';
setTimeout(() => {
key = localStorage.getItem('savedKey') || DEFAULT_KEY;
});
具有一致的类型可以避免意外比较等错误:
'82' == 82 // true
'82' === 82 // false
正如我的回答的评论中提到的,您在 activate
函数中还有另一个错误。
您将 activate
的参数命名为 key
,这将在您进行 key.keyCode == key
比较时隐藏全局 key
变量。
function activate(key) {
// ^^^ you are using the same name as the global key
if (IsInputing == false) {
if (key.keyCode == key) {
console.log('key pressed')
element.click();
}
}
}
如果 activate
中的 key
例如 'abcd'
,您的代码将执行 'abcd'.keyCode == 'abcd'
。
解决它的一种方法是重命名 activate
的参数:
function activate(activationKey) {
if (IsInputing == false) {
if (activationKey.keyCode == key) {
console.log('key pressed')
element.click();
}
}
}