昨天我在这里发表了一篇关于本地化bug的帖子。我的启动代码在没有我的6种语言之一的任何locale时都会fallback到‘fr’,所以德国和日本和波兰的玩家会在整个游戏中看到法语,包括一个20步的教程。 我修复了fallback到英语,并在教程窗口内添加了语言下拉菜单。 有人在评论中说下拉菜单不是过kill,并且我应该让它也可以通过键盘导航,因为在本地化破裂的情况下,玩家需要最少的假设才能恢复。 合理的。 我做了它当天晚上,测试通过了它之前就已经工作了。 我的第一个测试轮次从控制台分派键盘事件。 Tab,shift Tab,读取 document.activeElement,所有绿色。 然后我坐下,按下真实的键,仍然不可用。 分派的事件会触发你的处理程序,而你的处理程序调用 focus() 会移动 activeElement,所以我主要是在观察自己的处理程序调用自己并庆祝。 什么一个合成事件不能做的是驱动浏览器自己的顺序焦点导航。 这就是问题所在。 因为选择器已经是可焦点的。 它是一个原生的 <select>, 没有任何问题。 但教程遮罩位于DOM的末尾,所以从页面顶部tabbing会先经过22个游戏按钮。 我数了数。 23次按键。 并且这22个按钮位于遮罩的背后,所以你是在tabbing盲目地通过你看不到的东西,希望。 在纸上可访问,但在手中是无用的。 所以,这是一个焦点陷阱,硬编码的顺序而不是从DOM中发现的,因为原生的tab顺序在普通浏览器和打包的Electron构建之间不会表现出相同的行为,而打包的构建才是将要发货的构建: 函数 _tutTrapTab(e) { if (e.key !== 'Tab') return; const items = _tutFocusables(); // [语言选择器,跳过,返回,下一步] if (!items.length) return; e.preventDefault(); const i = items.indexOf(document.activeElement); let next; if (i === -1) next = items[0]; // 从外部到达:落地在选择器 else if (e.shiftKey) next = items[(i - 1 + items.length) % items.length]; else next = items[(i + 1) % items.length]; items.forEach(el => el.classList.remove('kb-focus')); next.classList.add('kb-focus'); next.focus(); } Tab会落地在语言选择器上,然后是教程按钮,然后循环。 焦点永远不会离开盒子。 然后我测试了它,并看到完全没有任何事情发生,因为有这行代码,在我的自己的CSS中,写的我自己,当我构建下拉菜单时: #tutorial-lang { outline: none; } 可达且不可见。 测试读取 activeElement 完全高兴地接受了它。 我在plain :focus 规则上画了个环,并继续前进。 然后我alt-tab并看了看窗口。 环已经消失了。 不是移到别的地方了,仅仅是消失了。 :focus 会在文档失去焦点时停止匹配,所以样式会静默地丢弃。 Steam遮罩打开时会做到这一点。 点击第二个监视器上的某个东西会做到这一点。 并且想想谁会在中断的教程中alt-tab。 这正是我为他们做所有这些的玩家,他们回来时什么都没有告诉他们他们在哪里。 所以,高亮现在是处理程序应用的 kb-focus 类,plus 一个mousedown监听器来去除它,以便你永远不会得到两个东西同时看起来焦点的。 不会通过控制台测试来捕捉到的。 你必须alt-tab。 按下真实的键也找到了一个与之无关的问题。 我的保存快捷键是: document.addEventListener('keydown', e => { if (e.key === 's' || e.key === 'S') { saveGame(); } }); 没有任何保护措施。 类型“s”来跳转到Español下拉菜单中保存了游戏。 同样,按下“s”在赌场投注字段或比特币购买输入中也会保存游戏。 我在顶部添加的保护措施: document.addEventListener('keydown', e => { const t = [e.target], tag = t.tagName; if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return; if (t.isContentEditable) return; if (e.key === 's' || e.key === 'S') saveGame(); }); 游戏是Wall Street Tycoon,一个关于金融的增量游戏,于2026年11月3日发布,免费的演示已经上线:https://store.steampowered.com/app/4738620/。 72个愿望清单,所以,早期阶段。 如果你测试键盘导航使用分派的事件,你正在测试的是你的处理程序是否会抛出异常。