1

我有兴趣在 Firefox 窗口的右侧打开一个 webPanel。根据一篇 MDN 文章,我确定这可以通过设置浏览器元素的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');
4

1 回答 1

1

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

  1. 用户使用 GUI(X-box)或键盘快捷键将其关闭。在这种情况下,Web 面板不一定会被卸载,因此没有unload事件。
  2. 另一个文档被加载到 Web 面板中。在这种情况下,您可能会得到一个unload.
  3. 用户打开另一个面板。不一定有unload.

如果您继续实施,您需要确保您的代码正确处理所有这三个。

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

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

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

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

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

说了这么多之后:我认为像这样弄乱侧边栏是个坏主意。 MDN wiki(!) 在这种情况下有不好的建议。

  • 侧边栏的设计不是为了这样弄乱。
  • 在弄乱侧边栏时,还有其他附加组件与您的“竞争”。
  • 在大多数情况下,侧边栏代码非常陈旧且维护不足。让您的要求正常工作非常困难。可能还有其他代码(在附加组件中)可以消除您和我没有想到的侧边栏。
  • 侧边栏可能不是首先显示您的内容的最佳位置(您没有说该内容是什么)。如果它是上下文帮助、字典/定义查找结果、登录表单之类的东西,那么它就不适合了。
  • 有些用户可能不喜欢他们永远在线的书签/历史侧边栏被你的取代。您可以通过重新打开前一个来处理这个问题,但这只会使事情变得更加复杂。

您可能最好使用其他方式来显示信息 - 例如,新选项卡、面板、新侧边栏(如社交侧边栏)......例如社交侧边栏不仅在右侧,它实际上是独立的侧边栏的“主要”侧边栏。

于 2013-09-13T10:37:26.043 回答