JavaScript在Vivaldi浏览器中无法捕获ESC按键keyup事件求助
解决方案
- 优先替换监听事件为
keydown
Vivaldi的全局ESC快捷键拦截逻辑作用于keyup事件阶段,keydown阶段不会被浏览器吞掉,是目前兼容性最好的修复方案,修改后的代码参考:
// 仅需把绑定的事件从keyup改为keydown即可 inp_elem.on("keydown", init_opt, $.proxy(this._processKeydown,this)); ... $.any.DataView.prototype._processKeydown = function (event) { if (event.preventDefault) event.preventDefault(); // 对应修改事件类型判断,也可追加event.key判断增强兼容性 if (event.type == "keydown" && (event.which == 27 || event.key == 'Escape')) { // 原有ESC处理逻辑保持不变 ... } ... }
这个方案兼容所有主流浏览器,原有Firefox、Chrome、Edge的逻辑不受任何影响。
- 如果必须保留
keyup监听逻辑,可以改用原生事件捕获模式
Vivaldi的keyup拦截仅作用于事件冒泡阶段,在捕获阶段监听可以拿到事件,参考代码:
// 原生事件监听开启捕获模式 inp_elem[0].addEventListener('keyup', (e) => { if (e.which === 27 || e.key == 'Escape') { // 调用你的原有处理逻辑 this._processKeyup(e); e.stopPropagation(); e.preventDefault(); } }, true); // 第三个参数true代表开启捕获
- 补充验证点
绑定事件前确认目标输入框处于聚焦状态,避免因焦点丢失导致事件无法触发的额外问题。
内容的提问来源于stack exchange,提问作者Arne M
相关产品推荐
相关产品推荐

