【问题标题】:Listener in a Content Script内容脚本中的侦听器
【发布时间】:2011-07-06 14:05:25
【问题描述】:

让我解释一下我的问题。我目前正在开发一个谷歌浏览器扩展,它在每个网页中注入一个工具栏作为 iframe。

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

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

提前致谢。

我试过了:

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"
}

工具栏.html

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

工具.js

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

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]');
    }
});

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"} );
          });
        });
    }
});

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

【问题讨论】:

  • 您能否说明您如何将请求发送到此内容脚本?

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


【解决方案1】:

要从后台页面向内容脚本发送请求,您需要使用 chrome.tabs.sendRequest(而不是 chrome.extension.sendRequest)并提供标签 ID。

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

编辑

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

【讨论】:

  • 但是你告诉我如何“从后台页面向内容脚本发送请求”我想从内容脚本向后台页面发送请求...
  • @Sindar 那你为什么要在内容脚本中创建一个监听器并从后台页面发送请求?那你需要把它全部切换。
  • @Serg 我不确定你是否明白我想要什么。要清楚, chrome.extension.sendRequest({action : "hideToolbar"});打电话给我的听众(内容脚本)。这就是我想要的,但它没有用,这里没有与背景页面的交互。你明白了吗?所以我想在我的内容脚本文件“listener.js”中创建一个监听器。
  • @Sindar 对不起,我不明白。如果您想内容脚本而不是发送请求,为什么要将addListener放在内容脚本中?在这种情况下,您需要将addListener 放在后台页面中,并使用sendRequest 从内容脚本发送请求。
  • 对于那些最近回答这个问题的人来说,这个 API 现在已经被弃用了。开发者应该使用chrome.runtime.sendMessage()
猜你喜欢
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多