内容脚本中的监听器

Sin*_*dar 6 javascript jquery google-chrome chromium google-chrome-extension

让我解释一下我的问题.我目前正在开发一个Google Chrome扩展程序,它会在每个网页中将工具栏注入iframe.

问题是我在某些情况下需要隐藏工具栏,重新显示它和类似的东西.Basicelly我想把我的听众放在我的背景页面上,但它没用,因为这个页面不能图形化地操纵对象.所以我的计划是将这个监听器放在content_script上(谁能用图形操作objet).但第二个问题是与背景页面相反的内容脚本不会一直执行,而只会执行一次.

所以我问自己是否有可能通过在其上放置一个循环或类似的东西使内容脚本听起来像一个背景页面......

提前致谢.

我试过这个:

的manifest.json

{   
    "background_page" : "background.html",
    "browser_action" :
    {
        "default_icon" : "images/extension.png"
        //"popup" : "activateToolbar.html"
    },
    "content_scripts": 
    [ {
          "all_frames": true,
          "css": ["css/yourtoolbar.css"],
          "js": ["js/jquery.js", "js/yourtoolbar.js", "js/listener.js"],
          "matches": ["http://*/*"],
          "run_at": "document_end"
    } ], 
    "permissions" : ["tabs", "unlimitedStorage", "http://*/*", "notifications"],    
    "name" : "YourToolbar",
    "version" : "1.1",
    "description" : "Make your own Toolbar"
}
Run Code Online (Sandbox Code Playgroud)

toolbar.html

<!-- Close Button -->
            <a href="javascript:hideToolbar()"><input type="image" src="images/close.png" name="close" width="18" height="18"></a>
Run Code Online (Sandbox Code Playgroud)

Tool.js

function hideToolbar()
{
    chrome.extension.sendRequest({action : "hideToolbar"});
    window.webkitNotifications.createHTMLNotification('instantMessage.html', 'Ask Show Menu').show();
}
Run Code Online (Sandbox Code Playgroud)

listener.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse){
    if(request.action)
    {
        $('body').remove();
        console.log('Received Start');
        alert(request.action);
        console.log('Received End');
    }
    else
    {
        console.log('nothing');
        alert('Not For Me [listener.js]');
    }
});
Run Code Online (Sandbox Code Playgroud)

background.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) 
{   
    if(request.newTab) 
    {
        // Create a new Tab
        chrome.tabs.create({url: request.newTab});
    }
    else if(request.newWindow)
    {
        // Create a new Window
        chrome.windows.create({url: request.newWindow});
    }
    else if(request.action)
    {       
        chrome.tabs.getAllInWindow(null, function(tabs) {
          $.each(tabs, function() {
            chrome.tabs.sendRequest(this.id, {"action":"hideToolbar"} );
          });
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

但问题是addListener没有阻止执行,他只是没有抓到任何东西......

ser*_*erg 7

要将请求从后台页面发送到内容脚本,您需要使用chrome.tabs.sendRequest(而不是chrome.extension.sendRequest)并提供选项卡ID.

在内容脚本中,您不需要定期创建chrome.extension.onRequest.addListener,只需创建一次,它将永久存在.

编辑

要从内容脚本发送请求,您需要在chrome.extension.sendRequest那里运行并添加chrome.extension.onRequest.addListener到后台页面.

  • 对于最近收到此答案的人,此API现已弃用.开发人员应该使用`chrome.runtime.sendMessage()`. (2认同)