Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript FireFox工具栏Prefwindow卸载/接受对话框事件以更新工具栏_Javascript_Events_Firefox Addon_Xul_Preferences - Fatal编程技术网

Javascript FireFox工具栏Prefwindow卸载/接受对话框事件以更新工具栏

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

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

所以我的结构是

在options.xul中,是一个预处理窗口,我将在

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