javascript - 如何在设置本地存储之前设置预定义密钥?
问题描述
我有一个热键,可以单击页面上的元素并使用默认键“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
,它将返回。null
let key = 82;
setTimeout(() => {
key = localStorage.getItem('savedKey');
});
这意味着您的代码本质上是:
key = 82;
setTimeout(() => {
key = null; // <-- you overwrite the key with null on the first run
});
key
仅当localStorage
没有先前缓存的值时尝试设置默认值:
let DEFAULT_KEY = 82;
setTimeout(() => {
key = localStorage.getItem('savedKey') || DEFAULT_KEY;
});
或者更简洁:
setTimeout(() => {
key = localStorage.getItem('savedKey') || 82;
});
注意:为避免一些潜在的未来错误,您可能希望在返回时将缓存值转换为数字(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
as ,这将在您进行比较时key
隐藏全局变量。key
key.keyCode == 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();
}
}
}
例如,如果key
在其中,您的代码就可以了。activate
'abcd'
'abcd'.keyCode == 'abcd'
解决它的一种方法是重命名activate
's 参数:
function activate(activationKey) {
if (IsInputing == false) {
if (activationKey.keyCode == key) {
console.log('key pressed')
element.click();
}
}
}
推荐阅读
- rest - 使用 rally-rest-api-2.1.2.jar 访问集会时出错
- python - 运行 subprocess.run 时 bool 对象不可调用 - pycharm 错误?
- java - 当 Java LinkedBlocking Queue 只有一个元素时,如果同时 put 和 take 会发生什么?
- tcl - Tk 画布文本小部件的居中如何工作?
- sql - 内部查询中的 order by 子句
- amazon-web-services - 即使存在数据,弹性搜索也会返回空结果
- mysql - 链接服务器 - 可以看到表但不能看到列
- c# - 为什么VB.NET中的动态对象调用TryInvokeMember而不是TryGetMember
- php - RabbitMQ 在 MQTT 中的 ACK 实现
- git - 分支说“已经是最新的”,即使我合并分支时它们是不同的