我正在尝试开发一个firefox工具栏;)
所以我的结构是
在options.xul中是一个PrefWindow,我正在打开
<toolbarbutton oncommand="esbTb_OpenPreferences()"/>
function esbTb_OpenPreferences() {
window.openDialog("chrome://Toolbar/content/options.xul", "einstellungen", "chrome,titlebar,toolbar,centerscreen,modal", this);}
所以在我的偏好中,我可以设置一些复选框,指示工具栏中显示的链接。因此,当首选项窗口处于关闭状态或“确定”按钮被命中时,我想引发一个事件或一个通过DOM我的工具栏更新的功能。
因此,这是加载工具栏时调用的函数。它设置工具栏的链接可见性。
function esbTB_LoadMenue() {
var MenuItemNews = document.getElementById("esbTb_rss_reader");
var MenuItemEservice = document.getElementById("esbTb_estv");
if (!(prefManager.getBoolPref("extensions.esbtoolbar.ShowNews"))) {
MenuItemNews.style.display = 'none';
}
if (!(prefManager.getBoolPref("extensions.esbtoolbar.ShowEservice"))) {
MenuItemEservice.style.display = 'none';
}
}
所以我尝试了一些想法,就像在对话框中添加一个eventlistener不起作用......就像我试过的那样...... 我还尝试从根窗口(工具栏)移交窗口对象作为opendialog函数的参数将函数更改为此。
function esbTB_LoadMenue(RootWindow) {
var MenuItemNews = RootWindow.getElementById("esbTb_rss_reader");
var MenuItemEservice = RootWindow.getElementById("esbTb_estv");}
然后尝试通过切换对象访问元素,但这也没有在运行时更改我的工具栏。
所以我要做的是在运行时更改工具栏中的visibile链接,我不明白我应该怎么做......
提前致谢
------- -------编辑
var prefManager = {
prefs: null,
start: function()
{
this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch("extensions.esbtoolbar.");
this.prefs.QueryInterface(Components.interfaces.nsIPrefBranch2);
this.prefs.addObserver("", this, false);
},
end: function()
{
this.prefs.removeObserver("", this);
},
observe: function(subject, topic, data)
{
if (topic != "nsPref:changed")
{
return;
}
//Stuff what is done when Prefs have changed
esbTB_LoadMenue();
},
SetBoolPref: function(pref,value)
{
this.prefs.setBoolPref(pref,value);
},
GetBoolPref: function(pref)
{
this.prefs.getBoolPref(pref);
}
}
所以这是我的实施。
答案 0 :(得分:1)
诀窍是听取偏好变化。这样,只要prefs改变,你的工具栏就会更新 - 无论它是通过你的PrefWindow发生的,关于:config还是其他一些机制。
在Toolbar.js中,您可以执行以下操作
var esbTB_observe = function(subject, topic, data) {
if (topic != "nsPref:changed") {
return;
}
// find out which pref changed and do stuff
}
var esbTB_init = function() {
prefs =
Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch("extensions.esbtoolbar.");
prefs.QueryInterface(Components.interfaces.nsIPrefBranch2);
prefs.addObserver("", esbTB_observe, false);
}
// Init addin after window loaded
window.addEventListener("load", esbTB_init, false);
现在,当窗口加载时,会调用esbTB_init()函数,其中pref分支的观察者为“extensions.esbtoolbar”。被添加。之后,当更改分支中的pref时,会自动调用esbTB_observe()函数。
在esbTB_observe()中,您必须读取首选项的值并调整工具栏。