Firefox addon 带有多个窗口的空白Firefox插件面板页面
我已经按照创建了一个切换按钮插件 除了一个问题外,一切正常:Firefox addon 带有多个窗口的空白Firefox插件面板页面,firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,我已经按照创建了一个切换按钮插件 除了一个问题外,一切正常: 打开第二个浏览器窗口(cmd+n或ctrl+n),然后单击此处的切换按钮 单击原始浏览器窗口上的切换按钮,而不关闭第二个窗口上的切换按钮 切换按钮的面板变为空白,并显示以下错误消息: JavaScript错误:resource:///modules/WindowsPreviewPerTab.jsm,第406行:不正确 或\u故障:组件返回故障代码:0x80004005(NS\u错误\u故障)[nsIT askbarTabPreview
$cd testButton;cfx运行
并按照上述步骤操作
我真的希望有人能帮我。提前谢谢你 这是一只虫子;你没有做错什么。这是windows焦点事件和面板事件之间的竞速状态,以某种方式阻止面板的隐藏事件正确发射 您可以尝试通过解决问题来缓解问题,直到问题得到正确解决。我在错误中添加了一些解释:但简而言之,您可以尝试添加一个
setTimeout
,在显示面板时延迟一点,以避免窗口焦点出现赛车情况。比如:
const { setTimeout } = require("sdk/timers");
/* ... your code here ... */
function handleChange(state) {
if (state.checked) {
setTimeout(() => panel.show({ position: button }), 100);
}
}
我目前正在使用一种变通方法,每次用户按下工具栏按钮时,我都会动态创建一个新的
面板
它比100毫秒的解决方案快,并且还可以处理用户在面板打开时直接关闭其中一个浏览器窗口的情况。(在这种情况下,100ms解决方案失败,仍显示空白面板。)
它的工作原理如下:
let myPanel = null;
const toolbarButton = ToggleButton({
...,
onChange: function (state) {
if (state.checked) {
createPanel();
}
}
});
function createPanel(){
// Prevent memory leaks
if(myPanel){
myPanel.destroy();
}
// Create a new instance of the panel
myPanel = Panel({
...,
onHide: function(){
// Destroy the panel instead of just hiding it.
myPanel.destroy();
}
});
// Display the panel immediately
myPanel.show();
}
我想你发现了一只虫子。我们应该制作一个simpele可复制的案例并上传到bugzilla。Mozilla可能需要很长时间来修复这个问题。目前有没有解决这个问题的方法?是的。你把这个bug归档了吗?如果你没有,我会帮你的。但解决方法是自己制作和处理面板(非sdk方式)。现在我确信你会想到的是SDK的魔力,我真的不知道所有的魔力,所以不能继续调试这个,我必须深入SDK源代码和DOM检查,看看发生了什么。对我来说,用这种非SDK的方式处理要容易得多,你愿意这样做吗?不过,它将消除您可能习惯于使用SDK的所有舒适性。当你回复时,请使用@否则我不会收到通知。谢谢@Noitidart。我已经向Mozilla提交了另一个bug(目前尚未提交)。但从未收到他们的回音。如果能解决这个问题,我将不胜感激。谢谢!它起作用了!你是Mozilla的开发者吗?你是怎么想出100毫秒这个神奇数字的?因为我测试过,即使是90毫秒的延迟也不够。是的,我是Mozilla的开发人员,曾经在SDK上工作,我编写了部分面板和按钮的大部分ui代码。不幸的是,我们有这样的赛车状况,我认为修复它并不容易——它可能需要一些平台的改变。关于“神奇数字”,通常100毫秒就足够了,但当涉及到超时时,你永远无法确定。
let myPanel = null;
const toolbarButton = ToggleButton({
...,
onChange: function (state) {
if (state.checked) {
createPanel();
}
}
});
function createPanel(){
// Prevent memory leaks
if(myPanel){
myPanel.destroy();
}
// Create a new instance of the panel
myPanel = Panel({
...,
onHide: function(){
// Destroy the panel instead of just hiding it.
myPanel.destroy();
}
});
// Display the panel immediately
myPanel.show();
}