Firefox插件按钮(browser_action)单击时未调用js

时间:2018-12-31 03:31:05

标签: firefox-addon

尝试创建一个简单的插件来重试Google中的duckduckgo搜索。它解析当前的duckduckgo网址搜索参数,将它们附加到Google网址,然后在新标签页中打开该网址。

将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];
}

2 个答案:

答案 0 :(得分:1)

您当前正在做的只是声明一个后台脚本。当浏览器加载插件时,将加载后台脚本,但是您需要一些代码来响应其他事件。

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

  

如果不提供弹出窗口,则当用户单击按钮时,会将click事件调度到扩展程序的后台脚本。   (...)   当用户使用以下代码单击图标时,扩展程序的后台脚本可以接收单击事件:   browser.browserAction.onClicked.addListener(function(){})

因此,在您的情况下,需要将“单击时”代码包装到此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 :(得分:0)

对于其他来这里遇到同样问题的人。这是观察到的教训:

  1. window.alert在后​​台脚本中不是问题。而是将内容包装在console.log()中。 Logging to console from Firefox extension?
  2. 事件监听器已经可以传递标签信息,请参见tabs.getCurrent() result is undefined?
  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});
    });