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