Javascript 如何在点击Chrome页面操作时捕获关键修改器

Javascript 如何在点击Chrome页面操作时捕获关键修改器,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我有一个页面操作,当点击时会将用户带到另一个页面 当用户单击地址栏中的铅笔图标时,他们会被带到当前选项卡中的不同页面,但是我希望他们能够按住ctrl、alt或ctrl键⇧ 在新选项卡或窗口中打开此页。这样他们就有了选择 翻阅文档,我看不出这是否可行。看起来不可能在页面操作中捕获按键。是这样吗?我想出了一个解决办法。我可以在页面中插入一个contentscript,用于侦听onkeydown和onkeydup事件。在本地存储中保存一个标志,该标志在页面加载时设置为false,如果按下altKey

我有一个页面操作,当点击时会将用户带到另一个页面

当用户单击地址栏中的铅笔图标时,他们会被带到当前选项卡中的不同页面,但是我希望他们能够按住ctrl、alt或ctrl键⇧ 在新选项卡或窗口中打开此页。这样他们就有了选择


翻阅文档,我看不出这是否可行。看起来不可能在页面操作中捕获按键。是这样吗?

我想出了一个解决办法。我可以在页面中插入一个contentscript,用于侦听
onkeydown
onkeydup
事件。在本地存储中保存一个标志,该标志在页面加载时设置为
false
,如果按下altKey则设置为
true
,如果不再按下altKey则设置为
false
。然后,后台页面可以请求单击页面操作时此标志的值

contentscript.js background.js
否,无法捕获页面上的按键操作。(我只有99%确定没有可行的解决方法,所以我将其作为一个评论-尽管没有太高的期望:)@ExpertSystem我正在研究一个解决方法,它使用localStorage通过内容脚本和消息传递来设置是否按下alt键(
onkeydown
onkeydup
)的标志。如果我找到了,我会发布解决方案…:)为什么我不先想到这个呢?+1干得不错!(顺便说一句,您仍然可以删除三元运算符,只需使用:
var isaltkeyppressed=(reponse==“true”);
;)感谢您提供关于三元运算符的提示(为什么我没有想到这一点?)。我花了大约一周的时间试图解决这个问题,结果放弃了。2个月后,我又回到了这个问题上,在发布这个问题的5分钟内,我就想到了这个问题!
// When the page action is clicked this flag could be left as true
// so we always set it to false on page load
localStorage["isAltKeyPressed"] = false;

window.addEventListener('keydown', recordAltKeyPress);
window.addEventListener('keyup', recordAltKeyPress);

function recordAltKeyPress(evt) {
    localStorage["isAltKeyPressed"] = evt.altKey;   
}

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if(request === "isAltKeyPressed") {
            sendResponse( localStorage["isAltKeyPressed"] );
        } else {
            sendResponse(undefined);    
        }
});
// Function to perform when pageAction is clicked
chrome.pageAction.onClicked.addListener(myFunction);

function myFunction(tab) {
    chrome.tabs.sendMessage(tab.id, "isAltKeyPressed", function(response) {
        // The response comes back as a string, we need a boolean...
        var isAltKeyPressed = (response === "true");
        // Do stuff...
    });
}