1

我编写了一个 Firefox 附加组件,它可以很好地作为叠加层,但现在我将其转换为 boostrapped(无重启)。它注册一个选项卡侦听器,然后在关闭选项卡时在某些情况下打开 HTML5 通知。

附加调试器告诉我 Notification 类未定义:

ReferenceError:未定义通知

根据 Mozilla 文档,不需要包含特殊的 JSM 即可使用通知。知道问题是什么,更重要的是,如何解决它?

4

2 回答 2

1

根据 Mozilla 文档,不需要包含特殊的 JSM 即可使用通知。

这仅适用于全局对象是 DOM 窗口的 javascript 上下文。自举插件只有 ecmascript 定义的对象 ( Object, Promise, ...)Components其他一些定义的沙盒中运行。

检查调试器以查看该范围内的确切可用内容。

因此,如果您想使用 HTML5 API 或导入另一个具有类似功能的服务,例如alertservice ,您要么需要检索窗口对象(xul windows 也应该工作)

于 2015-03-19T08:18:17.990 回答
0

正如8472 所说,引导加载项不会自动访问全局window对象。这与大多数 JavaScript 运行的上下文有很大不同。这是让相当多的人绊倒的事情。还需要注意的是,其中的代码bootstrap.js 可能在没有窗口存在的情况下运行,因此您无法获取。

如果存在浏览器窗口,您可以获得对最新浏览器windowdocument和的引用gBrowser

if (window === null || typeof window !== "object") {
    //If you do not already have a window reference, you need to obtain one:
    //  Add a "/" to un-comment the code appropriate for your add-on type.
    /* Add-on SDK:
    var window = require('sdk/window/utils').getMostRecentBrowserWindow();
    //*/
    //* Overlay and bootstrap (from almost any context/scope):
    var window=Components.classes["@mozilla.org/appshell/window-mediator;1"]
                         .getService(Components.interfaces.nsIWindowMediator)
                         .getMostRecentWindow("navigator:browser");        
    //*/
}
if (typeof document === "undefined") {
    //If there is no document defined, get it
    var document = window.content.document;
}
if (typeof gBrowser === "undefined") {
    //If there is no gBrowser defined, get it
    var gBrowser = window.gBrowser;
}
于 2015-03-19T11:46:11.570 回答