我知道如何使用position:button
展示panel。但是,当我尝试show()
一个额外的面板时,前一个面板消失了。
我不想禁用自动隐藏。但我想同时展示2个面板。
那么如何同时显示两者?
代码:
function handleChange(state) {
if (state.checked) {
panelf.show({
position: {
bottom: 20
}
});
panel.show({
position: button
});
}
}
答案 0 :(得分:1)
加载项SDK可防止一次打开多个sdk/panel
你无法完全按照自己的意愿去做。 sdk / panel API专门阻止一次显示多个sdk / panel。这是在该配置文件中加载的所有基于附加SDK的扩展程序中一次打开的一个sdk /面板。换句话说,如果某个其他基于Add-on SDK的扩展程序打开一个面板,您的将关闭。无法使用库存附加SDK代码禁用此功能。这在sdk/panel documentation(使用部分最后一段的一部分)中明确说明:
打开面板将关闭已打开的面板。
为了更清楚地说明此限制适用于所有附加SDK扩展,我已将文本更新为:
打开一个面板将关闭已经打开的Panel()构造函数创建的任何面板,即使该面板是由另一个基于Add-on SDK的扩展打开的。
使用Panel()
构造函数创建面板时,通过调用私有函数setupAutoHide(this);
将侦听器附加到面板。在某种程度上,setupAutoHide()
是[此段落中的人与代码编写时的永久链接:Panel()
,setupAutoHide(this);
setupAutoHide()
。]:< / p>
// Utility function takes `panel` instance and makes sure it will be
// automatically hidden as soon as other panel is shown.
var setupAutoHide = new function() {
let refs = new WeakMap();
return function setupAutoHide(panel) {
// Create system event listener that reacts to any panel showing and
// hides given `panel` if it's not the one being shown.
正如您应该能够从此代码中的注释中看出来的那样,它专门用于防止您想要做的事情(一次显示多个sdk /面板)。
显示内容的替代方法:
为了提供有关如何完成您的用户界面所需内容的详细建议,我们将需要更多信息,说明您希望如何处理这两个sdk/panels。
鉴于您没有描述您希望一次打开多个sdk /面板的原因,我不得不猜测。您可能希望在使用另一个作为sdk/ui/button/toggle的下拉面板时打开sdk /面板的一个原因是您使用第一个作为半永久性信息显示或对话框。在这种情况下,您应该使用不同的UI方法来显示该信息。根据您希望UI的外观,有多种可能性。一种可能性是实施ui/frame。
另一种可能性是使用openDialog()
中的open()
(或window/utils)来打开对话窗口。这些对话框窗口是完全独立的窗口,只要您愿意,它们就可以存在。如果需要,它的外观可以与sdk /面板几乎相同。它与当前页面或窗口的紧密耦合程度取决于您的编程。
Add-on SDK将sdk / panels实现为XUL popups。 Firefox中没有限制一次显示多个XUL弹出窗口。您可以在主Firefox DOM中自己创建这些,而不是使用Panel()
构造函数。
还有其他可能性包括:将第一个sdk / panel作为主窗口UI的不同部分或作为内容页面的一部分实现;或者,下拉sdk /面板可以实现为一个实际的下拉菜单<menupopup>
,它可以是实际菜单,也可以使用<panel>
具有任意内容。如果您真的需要,可以将其编码为完全显示,就像您使用了Panel()
构造函数一样。但是,后一种可能性围绕着Add-on SDK,如果Firefox的底层结构发生变化,可能会导致你的插件需要更多的持续维护。
关于如何实现您希望UI覆盖的内容,有太多可能性。情况尤其如此,因为我们不知道您尝试使用UI实现的目标是什么。