Firefox ToggleButton的正确用法是什么?

时间:2014-07-23 19:37:55

标签: javascript firefox firefox-addon firefox-addon-sdk

我正在使用SDK(版本1.16,Firefox版本31)编写和调试Firefox Addon。

我一直在使用ToggleButton小部件。我注意到,当我在[{1}}菜单中停用我的扩展程序时,我看到了几个类型错误:无法访问死对象'工具箱控制台中的消息。当我激活并打开标签时,会显示这些消息。

以下是演示此问题的示例中的简单代码:

about:addons

我是否需要在onUnload函数中以不同的方式执行某些操作(var ui = require("sdk/ui"); var button = ui.ToggleButton({ id: "my-button", label: "my button", icon: { "16": "./icon-16.png", "32": "./icon-32.png", "64": "./icon-64.png" }, onClick: handleClick }); function handleClick(state) { require("sdk/tabs").open("https://www.mozilla.org/"); } exports.onUnload = function (reason) { console.log("onUnload", reason); button.destroy(); } 除外)?

2 个答案:

答案 0 :(得分:2)

exports.onUnload相当有问题,即存在许多错误以及很多无法正常工作的错误。尽可能避免(至少现在)。

幸运的是,您实际上并不需要在卸载时销毁该按钮:SDK会自动为您执行此操作。 .destroy()实例方法适用于需要在卸载加载项之前销毁按钮的代码(例如,一旦用户登录就会被销毁的“登录”按钮)。

在您的特定示例中,ToggleButton是错误的选择。这样的按钮适用于基本上是复选框的东西(有两种状态,例如打开和关闭)。

相反,ActionButton可能更适合,看到点击实际执行某个操作(在新标签中打开某个网站)。

编辑:原来这是SDK中的一个错误,显然已经修复,因为它不存在。 然而,在当前的Firefox 31版本中它仍然存在,并且可以使用以下代码来触发:

var ui = require("sdk/ui");

var button = ui.ActionButton({
    id: "my-button",
    label: "my button",
    icon: "./icon-16.png"
});

由于它是一个SDK错误,并且在运行您的插件时并没有真正影响您,您现在应该忽略它,在将来的Firefox版本中它不再是问题。< / p>

答案 1 :(得分:0)

它是一个SDK错误,与按钮或sdk/ui模块无关,但更具体地说与event/domevent/chrome无关,在某种程度上与{{1}相关模块这也是按钮间接需要的 - 但不仅如此,因此您可能会遇到使用不同模块的相同问题。

简而言之,SDK在这些模块中添加了一些监听器,但是一旦禁用了加载项,它就不会执行适当的清理。因此,当事件发出时,他们会尝试执行不再存在的代码。

在最新版本的Firefox中修复了这些错误,特别是在bug 1001833bug 985332,但是这个错误,即使很烦人,也不会影响您的插件的功能,所以不要#39;担心。