FireFox工具栏Prefwindow卸载/ acceptdialog事件以更新工具栏

时间:2011-01-04 02:50:00

标签: javascript events firefox-addon xul preferences

我正在尝试开发一个firefox工具栏;)

所以我的结构是

alt text

在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);
    }
}

所以这是我的实施。

1 个答案:

答案 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()中,您必须读取首选项的值并调整工具栏。