在Chrome扩展程序中触发快捷键

3
我正在开发一个Chrome扩展程序,并将命令_execute_browser_action分配给Alt+J。 我想在background.js中模拟这个命令,通过监听所有命令实现此功能。
chrome.commands.onCommand.addListener(function(command) { /* ... */ });

我希望可以通过不同的快捷键调用_execute_browser_action,比如说用Cmd+Shift+K
在我的manifest.json中声明了以下内容:
"commands": {
    "_execute_browser_action": {
        "suggested_key": {
          "mac": "Alt+J",
          "linux": "Ctrl+Shift+J"
        }
    },
    "asdf" : {
        "suggested_key": {
          "default": "Ctrl+Shift+K",
          "mac": "Command+Shift+K"
        },
        "description": "asdf"
    }
  }

这是我的background.js文件:
chrome.commands.onCommand.addListener(function(command) {
  console.log('onCommand event received for message: ', command);
  if (command === "asdf") {
    alert("asdf");
    var keyPress = jQuery.Event("keypress");
    keyPress.altKey = true;
    keyPress.ctrlKey = false;
    keyPress.which = 74;
    //how do I trigger this?
  }
});

我想知道如何触发这个动作,以便打开我的popup.html。
1个回答

4
您无法自行触发键盘快捷键。
可以将其视为事件时间轴:
1.硬件事件发生,由操作系统转换为输入事件。 2.如果这是Chrome注册的全局快捷方式或Chrome处于焦点状态,则操作系统会将事件分派给Chrome。 3.Chrome检查是否注册了快捷方式。如果是,则触发相应的事件。 4.如果不是快捷键,而且页面有焦点,则Chrome将该事件作为DOM输入事件传递到页面中。 5.如果页面中有jQuery,则将DOM事件转换为其自己的内部事件,匹配监听器并将内部事件分派给它们。
您的代码仅触发了5个(内部jQuery)事件。
通过直接操纵DOM事件,可以增加到4个。
在此堆栈中,在任何情况下扩展都不能返回到第3个。 您正试图以迂回的方式从代码中打开弹出窗口。不幸的是,“普通”扩展无法完全实现 - 这是Chrome开发团队的有意决定。
考虑另一种提供UI的方式,例如通知或使用内容脚本在当前页面中注入。

我知道这是一个老问题,但我想知道这些扩展程序是如何实现的:https://chrome.google.com/webstore/detail/duplicate-tab-shortcut/klehggjefofgiajjfpoebdidnpjmljhb以及https://chrome.google.com/webstore/detail/new-tab-in-group-keyboard/hodhmojdnjljopdihkoniodkacnpimjf似乎在2021年是可能的。 - Keval Langalia
@KevalLangalia 它们通过调用那些操作的API(chrome.tabs)来工作,而不是通过向浏览器发送键盘事件。您可以要求Chrome注册自己的键盘快捷方式(您将从用户那里接收事件),然后您可以执行常规扩展程序可以执行的任何操作。 - Xan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接