Firefox addon Firefox插件按钮(浏览器操作)单击时不调用js

Firefox addon Firefox插件按钮(浏览器操作)单击时不调用js,firefox-addon,Firefox Addon,正在尝试创建一个简单的插件,以便在google中重试duckduckgo搜索。它解析当前duckduckgo url搜索参数,将其附加到google url,并在新选项卡中打开该url 当直接粘贴到duckduckgo搜索的控制台上下文中时,searchGoogle.js非常有效。插件在大约:调试中正确加载。。。但是我无法让“searchGoogle.js”在按钮(浏览器动作)点击时启动。我错过了什么? manifest.json { "manifest_version": 2,

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

当直接粘贴到duckduckgo搜索的控制台上下文中时,searchGoogle.js非常有效。插件在大约:调试中正确加载。。。但是我无法让“searchGoogle.js”在按钮(浏览器动作)点击时启动。我错过了什么?

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

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

以下是我在的MDN页面中发现的内容:

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

因此,在您的情况下,您需要将“点击”代码包装到这个
browserAction中

// 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图标时执行。

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

  • window.alert
    不是后台脚本中的内容。相反,在
    console.log()
    中包装内容
  • 事件侦听器已经可以传递选项卡信息,请参阅
  • 若要在单击按钮时触发,请不要在清单中提供弹出窗口,而是在
    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});
      });
      

    我想把它标记为答案。但我仍在努力让它开火*拉出“window.alert(googur+params);”*尝试使用事件侦听器包装函数的不同组合*在“关于:调试”中重新加载扩展*已选中*浏览器\确认我的清单正确的操作:。。。“浏览器操作”:{“默认图标”:“icons/48search pointer icon.png”,“默认标题”:“SearchGoogle”},“背景”:{“scripts”:[“SearchGoogle.js”]}…是否尝试用简单的
    控制台.log来替换代码,以检查事件是否正确触发?我就是这么做的,每次都会触发这个事件。我这样问是因为window.open或alert等操作在默认情况下可能是未经授权的(这只是一个假设)。但这是另一个问题。实际上我刚刚尝试过,
    window.alert
    在后台脚本中未被授权,
    window.open
    不会触发任何错误,只是什么也不做。这是有道理的,因为我想
    窗口
    在后台脚本中并不真正意味着什么。是的,我取消了警报。既然
    window
    没有任何意义,我还能用什么来代替呢?我正在查看
    browser.windows.create({url:“yourUrl”“})现在…它现在开火了,标记你的答案。非常感谢。现在只是想弄清楚为什么
    browser.tabs.getCurrent()返回null。