Chrome扩展程序:检测Chrome扩展程序外部的点击

时间:2017-05-16 15:03:50

标签: javascript jquery google-chrome google-chrome-extension

简而言之,我试图在屏幕的浏览器部分点击任何内容时重新加载扩展。我找到了,Capturing all the <a> click event,它给了我

window.onclick = function(e){alert(e.target);};

但是如果在扩展程序中单击了某些内容,则只会发出警报。有没有办法检测扩展本身外的点击并重新加载扩展名?

1 个答案:

答案 0 :(得分:0)

在我的头顶,我会说你只能从打开的各个标签获得点击。因此,您将错过URL栏以及标签区域外的浏览器的任何其他部分。

此处了解如何捕获所有标签上的点击次数。注意:将代码放在后台页面中。

chrome.tabs.query({}, function(tabs){
    for(var i = 0; i < tabs.length; i++){
        chrome.tabs.executeScript( tabs[i].id, {code:"window.onclick = function(e) { alert(e.target);};"},
                function(){} );
    }
});
chrome.tabs.onCreated.addListener(function(tab)  { 
   chrome.tabs.executeScript( tab.id, {code:"window.onclick = function(e) { alert(e.target);};"},
   function(){} );
});
chrome.tabs.onUpdated.addListener(function(tab)  { 
   chrome.tabs.executeScript( tab.id, {code:"window.onclick = function(e) { alert(e.target);};"},
   function(){} );
});

要通知您的扩展程序您的某个标签页上发生了点击,请使用chrome.runtime.sendMessage - 您可以通过添加chrome.runtime.onMessage.addListener来拦截后台页面中的此消息。收到消息后,您可以使用chrome.runtime.reload();

重新加载扩展程序

相反,当发生点击时调用alert(),请使用chrome.runtime.sendMessage,当您的后台页面收到消息时,chrome.runtime.reload应该重新加载扩展程序。

最终代码全部放在您的后台页面中,如下所示:

chrome.tabs.query({}, function(tabs){
    for(var i = 0; i < tabs.length; i++){
        chrome.tabs.executeScript( tabs[i].id, {code:"window.onclick = function(e) { chrome.runtime.sendMessage({msgID: "click_event"});};"},
                function(){} );
    }
});
chrome.tabs.onCreated.addListener(function(tab)  { 
   chrome.tabs.executeScript( tab.id, {code:"window.onclick = function(e) { chrome.runtime.sendMessage({msgID: "click_event"});};"},
   function(){} );
});
chrome.tabs.onUpdated.addListener(function(tab)  { 
   chrome.tabs.executeScript( tab.id, {code:"window.onclick = function(e) { chrome.runtime.sendMessage({msgID: "click_event"});};"},
   function(){} );
});

chrome.runtime.onMessage.addListener(function(req, sender, resp){

    if(req.msgID.indexOf("click_event") > -1)
    {   
       chrome.runtime.reload();
    }
}