检测换档/命令,单击Chrome浏览器操作按钮

Bra*_*gel 2 google-chrome-extension

是否可以检测到镀铬栏中浏览器操作按钮的Shift-click或Command-click?

例如,以下代码不起作用:

chrome.browserAction.onClicked.addListener(function(e) {
    console.log(e.shiftKey) // is undefined
});
Run Code Online (Sandbox Code Playgroud)

小智 5

我找到了一种方法来实现这一目标。就我而言,我需要在工具栏图标上检测到ctrl-clickctrl-alt-click事件。

显然,后台脚本无法捕获键盘事件,但是内容脚本可以。因此,我在内容脚本中设置了一个事件侦听器,以侦听ctrlalt按下按键并将消息发送到后台脚本。碰巧的是,该keydown事件具有boolean属性ctrlKey并且是altKey内置的,因此我不必隐式检查keypress的值。在您的情况下,可以使用该shiftKey属性。

content.js

window.addEventListener('keydown',function(event){
    if(event.ctrlKey){
        chrome.runtime.sendMessage({type: 'ctrlPressed'}, function(){});
    }
    if(event.altKey){
        chrome.runtime.sendMessage({type: 'altPressed'}, function(){});
    }       
});

window.addEventListener('keyup',function(event){
    chrome.runtime.sendMessage({type: 'keyup'}, function(){});  
});
Run Code Online (Sandbox Code Playgroud)

background.js

var ctrlPressed = false;
var altPressed = false;
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
    switch(request.type){
        case 'ctrlPressed':
            ctrlPressed = true;
            break;
        case 'altPressed':
            altPressed = true;
            break;
        case 'keyup':
            ctrlPressed = false;
            altPressed = false;
            break;
    }
}); 
Run Code Online (Sandbox Code Playgroud)

现在我chrome.browserAction.onClicked.addListener可以检测clickdouble-clickctrl-click,和ctrl-alt-click。(仅用一点点代码,我也可以检测到ctrl-double-clickctrl-alt-double-click。)唯一的警告是,活动选项卡必须具有焦点才能捕获按键。window.focus()例程末尾的行应处理该问题。

background.js

// Listen for toolbar icon clicks
var clickCnt = 0;
chrome.browserAction.onClicked.addListener(function(tab){
    clickCnt++; 
    if(clickCnt > 1){       
        console.log('Double click detected');
        clickCnt = 0;
        clearTimeout(timer);
    }else{                          
        if(ctrlPressed){
            if(altPressed){
                console.log('ctrl-alt-click detected');
            }else{
                console.log('ctrl-click detected');
            }
        }
        timer = setTimeout(function(){  
            console.log('Single click detected');
            clickCnt = 0;
        }, 250);
    }
    window.focus()
});
Run Code Online (Sandbox Code Playgroud)