Javascript FireFox工具栏Prefwindow卸载/接受对话框事件以更新工具栏
我正在尝试开发firefox工具栏;) 所以我的结构是 在options.xul中,是一个预处理窗口,我将在Javascript FireFox工具栏Prefwindow卸载/接受对话框事件以更新工具栏,javascript,events,firefox-addon,xul,preferences,Javascript,Events,Firefox Addon,Xul,Preferences,我正在尝试开发firefox工具栏;) 所以我的结构是 在options.xul中,是一个预处理窗口,我将在 <toolbarbutton oncommand="esbTb_OpenPreferences()"/> function esbTb_OpenPreferences() { window.openDialog("chrome://Toolbar/content/options.xul", "einstellungen", "chrome,titlebar,t
<toolbarbutton oncommand="esbTb_OpenPreferences()"/>
function esbTb_OpenPreferences() {
window.openDialog("chrome://Toolbar/content/options.xul", "einstellungen", "chrome,titlebar,toolbar,centerscreen,modal", this);}
所以我尝试了一些想法,比如在对话框中添加一个不起作用的eventlistener。。。以我尝试的方式。。。
我还尝试从根窗口(工具栏)移交window对象,因为opendialog函数的一个参数将函数更改为此
function esbTB_LoadMenue(RootWindow) {
var MenuItemNews = RootWindow.getElementById("esbTb_rss_reader");
var MenuItemEservice = RootWindow.getElementById("esbTb_estv");}
然后尝试通过移交对象访问元素,但这也没有在运行时更改我的工具栏
所以我想做的是在运行时更改工具栏中的可视链接,但我不知道该怎么做
提前谢谢
-------编辑-------
这就是我的实现。诀窍是倾听偏好的变化。这样,当prefs更改时,工具栏就会更新——不管它是通过PrefWindow、about: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()中,您必须读取prefs的值并调整工具栏。好的,我理解。因此,我认为我必须纠正prefmanager对象的实现。我现在有了这样一个var prefManager=Components.classes[“@mozilla.org/preferences service;1”]。。。然后我必须改变它,我可以添加他们的方法。所以有一个小问题,我现在正在设置pref,比如prefManager.setBoolPref(“extensions.esbtoolbar.rss.visted”,true);例如,我是否必须在prefmanager对象中实现设置和获取Pref的方法?我希望您知道我的意思:)考虑到您不必实现nsIPrefBranch2接口,您只需简单地使用它。你是在问观察法应该放在哪里吗?我在回答中加了一些代码和解释。希望有帮助。我还编辑了我的答案。所以我认为这也行吗?我是否需要这个设置和获取prefs SetBoolPref:function(pref,value)、GetBoolPref:function(pref)的实现?还是说这更简单。谢谢你的时间,我认为这样实施是有意义的。不过,我会为对象使用不同的名称,因为prefManager通常是firefox首选项服务使用的变量名(如var prefManager=Components.classes[“@mozilla.org/preferences service;1”…)。也许可以称之为esbTB_prefManager或其他什么。
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';
}
}
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);