当 Esc 键被捕获时,如何退出 Pentadactyl 中的直通模式?

当 Esc 键被捕获时,如何退出 Pentadactyl 中的直通模式?

重现步骤:

  1. 访问这一页. 它是一个完全由以下部分组成的 JSFiddle

    window.onkeydown = function(e) { e.preventDefault(); };
    
  2. 单击白色顶栏下方的灰色区域内,将焦点集中在主要区域。

  3. Ctrl+Z进入直通模式。

  4. Esc。此操作将会失败,因为密钥被 JavaScript 拦截,并且从未发送给 Pentadactyl。

在示例中,通过单击顶部栏将焦点从包含 的区域转移开onkeydown,允许 Escape 通过并退出 Pass Through 模式,可以轻松缓解此问题。但是,我正在使用一个拦截全部通过按键(带有preventDefaultwindow.onkeydown,因此没有地方可以将焦点转移到。

我能找到的唯一解决方案是创建一个新选项卡,然后关闭它(d)。但是,这需要使用鼠标(t因为我们处于“穿透”模式,快捷方式不再有效),而且这是一种不成熟的解决方法。

在拦截所有按键操作的网站上,有没有什么方法可以仅使用键盘退出直通模式?

答案1

  • 在您链接的 JSFiddle 上,至少Ctrl-TABCtrl- 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
    );
    

相关内容