转换为bootstrapped:通知未定义

时间:2015-03-18 23:27:35

标签: javascript html5 firefox-addon firefox-addon-restartless

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

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

ReferenceError:未定义通知

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

2 个答案:

答案 0 :(得分:1)

  

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

这仅适用于全局对象是DOM窗口的javascript上下文。 Bootstrapped插件run in a sandbox,仅定义了ecmascript定义的对象(ObjectPromise,...),Componentsa few others

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

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

答案 1 :(得分:0)

作为the8472 has stated,引导加载项不会自动访问全局window对象。这与运行大多数JavaScript的上下文有很大不同。它吸引了相当多的人。还应注意bootstrap.js 中的代码可能在没有窗口时运行,因此您无法获得。

如果存在浏览器窗口,您可以通过以下方式获取对最新浏览器windowdocumentgBrowser的引用:

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