【问题标题】:What is the correct usage of Firefox ToggleButton?Firefox ToggleButton 的正确用法是什么?
【发布时间】:2014-08-09 03:51:16
【问题描述】:

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

我一直在使用 ToggleButton 小部件。我注意到,当我的扩展在 about:addons 菜单中被禁用时,我在工具箱控制台中看到几条“TypeError:无法访问死对象”消息。当我激活并打开标签时,这些消息就会显示。

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

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();   
}

我是否需要在 onUnload 函数中做一些不同的事情(destroy 除外)?

【问题讨论】:

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


    【解决方案1】:

    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 版本中它不再是问题。

    【讨论】:

    • 我进行了更改以使用 ActionButton,但在禁用扩展程序并单击选项卡时会出现相同的错误消息 "can't access dead object"
    • 感谢您的快速回复。我认为这可能是一个错误,但不确定。
    【解决方案2】:

    这是一个 SDK 错误,与按钮或 sdk/ui 模块无关,而更具体地与 event/domevent/chrome 相关,在一定程度上与 system/events 模块相关;按钮也是间接需要的——但不仅如此,使用不同的模块可能会遇到同样的问题。

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

    这些错误已在最新版本的 Firefox 中得到修复,特别是在 bug 1001833bug 985332 中,但该错误即使很烦人,也不会影响您的插件的功能,所以不用担心。

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 2011-04-15
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多