Javascript 如何使浏览器操作按钮的外观和行为类似于切换
目标是为Firefox获取一个WebExtension,用户可以在工具栏中激活/停用该扩展,如开/关开关 我将background.js与以下代码一起使用:Javascript 如何使浏览器操作按钮的外观和行为类似于切换,javascript,firefox,firefox-addon,firefox-addon-webextensions,Javascript,Firefox,Firefox Addon,Firefox Addon Webextensions,目标是为Firefox获取一个WebExtension,用户可以在工具栏中激活/停用该扩展,如开/关开关 我将background.js与以下代码一起使用: browser.browserAction.onClicked.addListener(函数(选项卡){ 开关(按钮){ 案例“开启”: 启用(); 打破 案例“关闭”: 禁用(); 打破 } }); 函数启用(){ browser.browserAction.setIcon({path:'/ui/is on.png',}); browse
browser.browserAction.onClicked.addListener(函数(选项卡){
开关(按钮){
案例“开启”:
启用();
打破
案例“关闭”:
禁用();
打破
}
});
函数启用(){
browser.browserAction.setIcon({path:'/ui/is on.png',});
browser.browserAction.setPopup({popup:'/ui/off.js',});
browser.webNavigation.onCommitted.addListener(onTabLoad);
}
函数禁用(){
browser.browserAction.setIcon({path:'/ui/is off.png',});
browser.browserAction.setPopup({popup:'/ui/turn-on.js',});
browser.webNavigation.onCommitted.removeListener(onTabLoad);
}
功能加载(详细信息){
browser.tabs.executeScript(details.tabId{
文件:'/gc.js',
所有这些都是真的,
});
}
启用();//默认情况下启用或禁用
显然我做错了什么。我是个编程新手。这是我试图完成的个人项目。您的代码
当您添加了一个switch
语句来打开按钮时,您从未定义过按钮,也没有更改其状态。您也没有默认的大小写,只是为了防止按钮
变量不是您在大小写
语句中测试的值之一
您不应该使用browserAction.setPopup()
设置弹出窗口。设置弹出窗口将导致弹出窗口被打开,而不是您的后台页面接收到单击事件。此外,弹出窗口需要是HTML页面,而不是JavaScript
有关Firefox bug,请参见下面的部分,您需要在onTabLoad()
中解决该bug
收听webNavigation.onCommitted
不足以涵盖需要注入脚本的所有情况。换句话说,webNavigation.onCommitted
不会在每次加载页面时触发。要完全涵盖需要注入脚本的每种情况,您需要在另一个问题中提问
var nextButtonState;
browser.browserAction.onClicked.addListener(function (tab) {
switch (nextButtonState) {
case 'turn-on':
enable();
break;
case 'turn-off':
default:
disable();
break;
}
});
function enable() {
browser.browserAction.setIcon({ path: '/ui/is-on.png', });
//browser.browserAction.setPopup({ popup: '/ui/turn-off.js', });
browser.webNavigation.onCommitted.addListener(onTabLoad);
nextButtonState = 'turn-off';
}
function disable() {
browser.browserAction.setIcon({ path: '/ui/is-off.png', });
//browser.browserAction.setPopup({ popup: '/ui/turn-on.js', });
browser.webNavigation.onCommitted.removeListener(onTabLoad);
nextButtonState = 'turn-on';
}
function onTabLoad(details) {
//Add a setTimout to avoid a Firefox bug that Firefox is not quite ready to
// have tabs.executeScript() inject a script when the onCommitted event fires.
setTimeout(function(){
chrome.tabs.executeScript(details.tabId, {
file: '/gc.js',
allFrames true,
});
},0);
}
enable(); // enable or disable by default
FirefoxwebNavigation.onCommitted
bug的解决方法
您的onTabLoad()
代码需要更改才能使用webNavigation。onCommitted
listener在Firefox中使用tabs.executeScript()
插入脚本(在Chrome中不需要)。这是由于Firefox中的一个错误,如果立即从webNavigation.onCommitted
侦听器执行,则会导致tabs.executeScript()
失败。我使用的解决方法是在setTimeout(函数,0)
延迟后注入脚本。这允许Firefox执行必要的代码,以设置executeScript()
正常运行所需的环境
函数onTabLoad(详细信息){
//添加一个setTimout以避免Firefox尚未准备好的Firefox bug
//让tabs.executeScript()在触发onCommitted事件时插入脚本。
setTimeout(函数(){
chrome.tabs.executeScript(details.tabId{
文件:'/gc.js',
所有这些都是真的,
});
},0);
}
多状态按钮(例如切换按钮)的通用解决方案
下面是我用来使浏览器操作按钮的行为类似于切换的代码。我修改了browserButtonStates
对象,该对象描述了按钮的功能和外观,用于添加和删除您的webNavigation.onCommitted
侦听器,onTabLoad()
。有关onTabLoad()
的问题,请参见上文
下面的代码比您需要的更复杂。我编写它的目的是能够将它从一个项目移动到另一个项目,而只需要更改browserButtonStates
对象的内容。然后,只需更改该对象,即可更改图标、文本、徽章文本、徽章颜色以及在每个状态(例如打开/关闭)下执行的操作
background.js
//browserButtonStates对象描述按钮可能处于的状态以及
//在该状态下单击按钮时调用的“action”函数。
//在这种情况下,我们有两种状态“开”和“关”。
//您可以根据需要将其扩展到任意多个州。
//icon是browserAction.setIcon()的字符串或详细信息对象
//每个州的标题必须是唯一的。它用于跟踪状态。
//它向用户指示单击按钮时将发生什么。
//换句话说,它反映了用户的下一个状态
//透视图。
//action是在此状态下单击按钮时要调用的函数。
变量browserButtonStates={
defaultState:'关闭',
关于:{
图标:'/ui/is on.png'
//文本:“On”,
//徽章颜色:“绿色”,
标题:“关闭”,
操作:功能(选项卡){
chrome.webNavigation.onCommitted.removeListener(onTabLoad);
},
下一状态:“关闭”
},
关:{
图标:'/ui/is off.png'
//文本:“关闭”,
//徽章颜色:“红色”,
标题:“打开”,
操作:功能(选项卡){
chrome.webNavigation.onCommitted.addListener(onTabLoad);
},
下一状态:“开”
}
}
//这将在状态之间移动浏览器操作按钮并执行该操作
//单击按钮时。对于两个状态,这将在它们之间切换。
chrome.browserAction.onClicked.addListener(函数(选项卡){
chrome.browserAction.getTitle({tabId:tab.id},函数(标题){
//检查错误后,标题用于确定
//如果这将打开或关闭。
如果(chrome.runt
{
"description": "Demo Button toggle",
"manifest_version": 2,
"name": "Demo Button toggle",
"version": "0.1",
"background": {
"scripts": [
"background.js"
]
},
"browser_action": {
"default_icon": {
"32": "myIcon.png"
},
"default_title": "Turn On",
"browser_style": true
}
}