Firefox 插件按钮 (browser_action) 在点击时不调用 js

Firefox addon button (browser_action) not calling js on click

正在尝试创建一个简单的插件来重试 google 中的 duckduckgo 搜索。它解析当前的 duckduckgo url 搜索参数,将它们附加到 google url,并在新选项卡中打开 url。

searchGoogle.js 直接粘贴到 duckduckgo 搜索的控制台上下文时效果很好。插件在 about:debugging 中正确加载...但是 我无法让 "searchGoogle.js" 在按钮 (browser_action) 单击时触发。我在这里错过了什么?

manifest.json

  {

  "manifest_version": 2,
  "name": "SearchGoogle",
  "version": "1.0",

  "description": "Repeats a duckduckgo search in a new tab using google.",

  "icons": {
    "48": "icons/48search-pointer-icon.png",
    "32": "icons/32search-pointer-icon.png",
    "16": "icons/16search-pointer-icon.png"
  },

  "permissions": [
    "tabs",
    "activeTab",
    "webRequest",
    "webNavigation"
  ],

  "browser_action": {
      "default_icon": "icons/48search-pointer-icon.png",
      "default_title": "SearchGoogle"
    },

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

}

searchGoogle.js

var myStr = window.location.href;
var googurl = 'https://www.google.com/search?q=';
var params = getmyuri('q', myStr);
window.open(googurl+params, '_blank');
window.focus();
window.alert(googurl+params);

function getmyuri(n,s){
n = n.replace(/[\[]/,"\[").replace(/[\]]/,"\]");
var p = (new RegExp("[\?&]"+n+"=([^&#]*)")).exec(s);
return (p===null) ? "" : p[1];
}

您目前所做的只是声明一个后台脚本。浏览器加载插件时会加载后台脚本,但您需要一些代码来对其他事件做出反应。

这是我在 browser_action 的 MDN 页面中找到的内容:

If you don't supply a popup, then a click event is dispatched to your extension's background scripts when the user clicks the button. (...) The extension's background scripts can receive click events when the user clicks the icon using code like this: browser.browserAction.onClicked.addListener(function(){})

因此,在您的情况下,您需要将 "on click" 代码包装到此 browserAction.onClicked 事件处理程序中,如下所示:

// searchGoogle.js

browser.browserAction.onClicked.addListener(function(){
  var myStr = window.location.href;
  var googurl = 'https://www.google.com/search?q=';
  var params = getmyuri('q', myStr);
  window.open(googurl+params, '_blank');
  window.focus();
  window.alert(googurl+params);
});

瞧,你的代码应该在你每次点击 browserAction 图标时执行。

对于任何带着同样问题来到这里的人。以下是观察到的教训:

  1. window.alert 不是后台脚本中的东西。相反,将内容包装在 console.log() 中。 Logging to console from Firefox extension?
  2. 事件侦听器已经可以传递选项卡信息,请参阅
  3. 要在单击按钮时触发,请勿在清单中提供弹出窗口,并将要触发的代码包装在 browser.browserAction.onClicked.addListener(function(){}) 中。

这是最终的工作脚本。

  • 主要保持不变。
  • JS是:

    browser.browserAction.onClicked.addListener(function(tab){
    
        function getmyuri(n,s){
            n = n.replace(/[\[]/,"\[").replace(/[\]]/,"\]");
            var p = (new RegExp("[\?&]"+n+"=([^&#]*)")).exec(s);
            return (p===null) ? "" : p[1];
        }
    
        console.log(tab)
        var googurl = 'https://www.google.com/search?q=';
        var params = getmyuri('q', tab.url);
        browser.tabs.create({url: googurl+params});
    });