重现步骤:
访问这一页. 它是一个完全由以下部分组成的 JSFiddle
window.onkeydown = function(e) { e.preventDefault(); };
单击白色顶栏下方的灰色区域内,将焦点集中在主要区域。
按Ctrl+Z进入直通模式。
按Esc。此操作将会失败,因为密钥被 JavaScript 拦截,并且从未发送给 Pentadactyl。
在示例中,通过单击顶部栏将焦点从包含 的区域转移开onkeydown
,允许 Escape 通过并退出 Pass Through 模式,可以轻松缓解此问题。但是,我正在使用一个拦截全部通过按键(带有preventDefault
)window.onkeydown
,因此没有地方可以将焦点转移到。
我能找到的唯一解决方案是创建一个新选项卡,然后关闭它(d
)。但是,这需要使用鼠标(t
因为我们处于“穿透”模式,快捷方式不再有效),而且这是一种不成熟的解决方法。
在拦截所有按键操作的网站上,有没有什么方法可以仅使用键盘退出直通模式?
答案1
在您链接的 JSFiddle 上,至少Ctrl-TAB和Ctrl- Shift-TAB仍然有效,因此您可以切换到下一个选项卡并返回以取消直通模式。出于某种原因,您仍然无法访问命令行,但其他键可以使用,因此您可以随时刷新页面以r修复该问题。
作为一种不太黑客的解决方案,您可以在 .pentadactylrc 文件中定义一个命令来阻止页面窃取关键事件:
command! nointercept -js document.addEventListener('keydown', function(e) { e.stopImmediatePropagation(); return false;}, true);
然后,如果您
:nointercept
在点击主区域之前在页面上执行,您将能够退出直通模式。使用此方法,离开直通模式后,命令行可以正常工作。如果仅仅想让页面不拦截密钥Esc,可以修改命令进行测试
e.keyCode===27
。如果你想自动应用上述代码,你可以将其变成用户脚本(需要油脂猴你可能知道)。如果你在以下位置填写了正确的 URL 或 URL 模式,则以下内容应该有效:
@include
// ==UserScript== // @name nointercept // @description Prevent site from stealing key presses // @run-at document-start // @include http://site.url // ==/UserScript== document.addEventListener( 'keydown', function(e) { e.stopImmediatePropagation(); return false; }, true );