【问题标题】:Run script each time Chrome extension icon clicked每次单击 Chrome 扩展程序图标时运行脚本
【发布时间】:2011-11-02 08:37:34
【问题描述】:

如何编写 chrome 扩展程序,以便每次用户单击图标时,我的脚本都会运行,但不会打开弹出窗口? (我自己会在文档中查找这一点,但无论出于何种原因,他们突然停止工作,每页都出现 404 错误,直到我到了这一点)。

我假设它只是正确设置清单。这是我现在拥有的:

{
  "name": "My Extension",
  "version": "0.1",
  "description": "Does some simple stuff",
  "browser_action": {
    "popup" : "mine.html",
    "default_icon": "logo.png"
  },
  "permissions": [
    "notifications"
  ]
}

【问题讨论】:

    标签: google-chrome google-chrome-extension


    【解决方案1】:

    从清单的 browser_action 部分中删除弹出窗口,并在后台脚本中使用 background pagesbrowser Action

    chrome.browserAction.onClicked.addListener(function(tab) { alert('icon clicked')});
    

    【讨论】:

    • 我把这个放在哪里。如果没有 mine.html,扩展中唯一的文件是清单......好吧,还有图标。
    • 看看背景页面 - code.google.com/chrome/extensions/background_pages.html。那是您放置长时间运行的代码和跨不同页面通用的代码的地方。上面文档的链接有一个带有 browserAction.onClicked 的示例
    • 啊,明白了。我最初尝试了一个背景页面,但不知道 browserAction.onClicked。
    • 如果 manifest.json 中没有 browser_action 部分,那么它将不起作用。您必须在 manifest.json 中添加空的 browser_action:“browser_action”:{}
    【解决方案2】:

    不要指定弹出页面,而是使用chrome.browserAction.onClicked API,记录在here

    【讨论】:

      【解决方案3】:

      首先,如果您不想显示弹出窗口,请从您的 manifest.json 中删除 "popup" : "mine.html"(显示在您的问题中)。

      您的manifest.json 将如下所示:

      {
        "name": "My Extension",
        "version": "0.1",
        "manifest_version" : 2,
        "description": "Does some simple stuff",
        "background" : {
          "scripts" : ["background.js"]
        },
        "browser_action": {
          "default_icon": "logo .png"
        },
        "permissions": ["activeTab"]
      }
      
      • 请注意,manifest_version 必须存在且必须是 2
      • 请注意,activeTab 权限已添加。
      • 请注意,当单击浏览器操作按钮时,您只能做一件事:您可以显示一个弹出窗口,或者您可以执行一个脚本,但您不能同时做这两个。

      其次,要在单击图标时执行脚本,请将以下代码放入您的background.js 文件中(文件名在您的manifest.json 中指定):

      chrome.browserAction.onClicked.addListener(function(tab) {
         chrome.tabs.executeScript(null, {file: "testScript.js"});
      });
      

      最后,testScript.js 是您应该在单击图标时放置要执行的代码的位置。

      【讨论】:

      • 截至 2017 年 2 月,此解决方案完全符合原始问题中的要求。
      • 太好了,这项工作对我来说是 2018 年 6 月。值得投票! @kerzek 可能是这样的:js function buttonClicked(tab) { var msg = { message: "user clicked!" } chrome.tabs.sendMessage(tab.id, msg); }
      • 为清楚起见,onClicked 侦听器在您移除弹出窗口时触发。这是其中之一,而不是两者。
      【解决方案4】:

      这正是我所需要的,但我应该添加: 如果您只需要一个一次性事件,例如用户单击扩展程序的图标时,那么后台页面会浪费资源,因为它会一直在后台运行。 改用活动页面:

      "background": {
          "scripts": ["script.js"],
          "persistent": false
      }
      

      【讨论】:

      • 如果这是真的他们你应该使用content_script 代替并将脚本附加到你的DOM。只使用一次在后台运行的功能违背了从一开始就使用后台的功能概念。只是一个想法,并不意味着这个想法行不通。
      【解决方案5】:

      您需要添加一个背景文件。 但首先你需要在 manifest.json 中添加一个属性,例如,

      "background":{
          "scripts":["background.js"]
      }
      

      现在将扩展文件夹中的文件命名为 background.js 有一种方法可以将对象从后台发送到您的内容脚本假设您的内容脚本名为 content.js,那么您需要做的是在 background.js 文件中编写此代码 sn-p

      chrome.browserAction.onClicked.addListener(sendfunc);
      function sendfunc(tab){
          msg={txtt:"execute"};
          chrome.tabs.sendMessage(tab.id,msg);
      }
      

      上面的代码所做的是将一个名为 msg 的对象发送到内容页面,这个 msg 对象有一个属性 txtt,它等于“执行”。 接下来你需要做的是将内容脚本中的值比较为

      chrome.runtime.onMessage.addListener(recievefunc);
      function receivefunc(mssg,sender,sendResponse){
          if(mssg.txtt==="execute"){
            /*  
               your code of content script goes here
            */
          }
      }
      

      现在,每当您单击扩展图标时,都会将名为 msg 的对象从背景发送到内容。函数“recievefunc()”会将其 txtt 属性与字符串“execute”进行比较,如果它与您的其余代码匹配将运行。

      注意:msg,txtt,sendfunc,receivefunc,mssg 都是变量而不是 chrome 关键字,所以你可以使用任何你想要的东西。

      希望对你有帮助。

      :)

      【讨论】:

        【解决方案6】:

        如果你想关注manifest 3,那么你应该这样做:

        chrome.action.onClicked.addListener(function (tab) {
            console.log("Hello")
        });
        

        进一步注意,您不会在普通控制台中看到Hello,要查看hello,请转到扩展菜单并单击特定扩展菜单前面的inspect views

        【讨论】:

        • 我把这个放在哪里? background.js 已弃用
        【解决方案7】:

        在清单 3 中,您可能会这样做

        // manifest.json

          "background": {
          "service_worker": "back.js"
        },
        

        // back.js

        chrome.action.onClicked.addListener(tab => { 
        chrome.tabs.create({
            url: 'index.html'
          });
         });
        

        【讨论】:

        • 这工作正常,但在后续点击时会打开多个标签。我怎样才能防止这种情况发生?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-09
        • 2018-06-08
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 2018-03-09
        相关资源
        最近更新 更多