列表页做了 J K 上下切换,实测按 K 没反应,按 J 反而打开下载面板,同一套快捷键在 Chrome 和 Edge 上表现还不一样。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
document.addEventListener('keydown', e => {
if (e.target.matches('input,textarea,[contenteditable]')) return
if (e.ctrlKey || e.altKey || e.metaKey) return
if (e.key === 'j') { next(); e.preventDefault() }
})
keydown 监听挂在 window 上却没有判断事件来源,浏览器和扩展的内置快捷键先一步吃掉按键。回调里也没有阻止默认行为,焦点在输入框时同样会被截走。这一点先确认清楚,后面就不用反复试。
「快捷键冲突」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。
具体做法是,在 keydown 里先判断焦点是否落在输入框、文本域或可编辑区域,是就直接返回;只处理没有修饰键的组合,带 Ctrl 或 Alt 的交给浏览器;确认要接管时调用 preventDefault,并给用户一个关闭快捷键的开关。
改完照着核一遍,焦点在搜索框里按 J 只输入字母,回到列表按 J 才切换条目,控制台无报错。
