如何检测Firefox WebPanel何时关闭?

时间:2013-09-12 16:29:24

标签: javascript firefox-addon

我有兴趣在Firefox窗口的右侧打开一个webPanel。根据{{​​3}},我确定可以通过设置浏览器元素的direction样式来完成。但是,我希望在webPanel关闭后清除此设置。有没有办法可以发现这个?到目前为止,我能想到的唯一方法是轮询sidebarWindow.location.href(以检测侧边栏是否已更改)和sidebarHidden(以检测侧边栏是否已关闭)。

var browser = document.getElementById('browser');
browser.style.direction = "rtl";

var sidebarWindow = document.getElementById("sidebar").contentWindow;
var sidebarBox = document.getElementById('sidebar-box');
var sidebarHidden = sidebarBox.collapsed || sidebarBox.hidden;

sidebarWindow.addEventListener("unload", function (event) {
    alert("1"); //This code fires when the web panel is opened
                //but not when it is closed.
});
sidebarBox.addEventListener("unload", function (event) {
    alert("2"); //This code does not fire.
});
sidebarWindow.addEventListener("close", function (event) {
    alert("3"); //This code does not fire.
});
sidebarBox.addEventListener("close", function (event) {
    alert("4"); //This code does not fire.
});  

openWebPanel('Test', 'http://www.google.com');

1 个答案:

答案 0 :(得分:1)

IIRC基本上可以通过三种方式“关闭”侧边栏:

  1. 用户使用GUI(X-box)或键盘快捷键关闭它。在这种情况下,Web面板不一定会被卸载,因此没有unload事件。
  2. 将另一个文档加载到Web面板中。在这种情况下,您可能会获得unload
  3. 用户打开另一个面板。不一定是unload
  4. 如果你继续执行你的实现,你需要确保你的代码正确处理所有这三个。

    1. 和3.应该通过<broadcaster id="viewWebPanelsSidebar">更改checked属性(请参阅toggleSidebar()的实现)来观察,因此您可以让另一个元素观察并作用于{ {3}}

    2. 应该听取unload并采取相应行动。

    3. 为了获得正确的unload事件,我认为以下应该可以解决这个问题:

      sidebar.contentDocument.getElementById("web-panels-browser")).
        addEventListener("unload", ...);
      

      但是我的记忆有点不稳定,所以你可能需要摆弄一下。 (sizebar有<xul:browser id="web-panels-browser">,显示实际内容......)

      在说完所有这些之后:我认为像这样混淆边栏是个坏主意。 在这种情况下,MDN wiki(!)有不好的建议。

      • 侧边栏的设计并不像这样。
      • 当涉及到边栏时,还有其他的“与你竞争”的附加组件。
      • 侧边栏代码在很大程度上是相当陈旧和维护不足的。让你的要求正常工作非常困难。可能还有其他代码(附加组件)可能会忽略您和我没有想到的侧边栏。
      • 侧栏可能不是首先显示您的内容的最佳位置(您没有说的内容)。如果它像上下文帮助,字典/定义查找结果,登录表单,那么它将不适合。
      • 有些用户可能不喜欢他们的永远在线书签/历史边栏被您的替换。你可以通过重新打开前一个来解决这个问题,但这只会使问题进一步复杂化。

      您可能最好使用其他方式来显示信息 - 例如一个新的标签,一个面板,一个像社交边栏一样的新侧边栏...例如,社交侧边栏不仅在右侧,它实际上是一个独立的侧边栏,不是“主要”侧边栏的一部分。