我编写了一个 Firefox 附加组件,它可以很好地作为叠加层,但现在我将其转换为 boostrapped(无重启)。它注册一个选项卡侦听器,然后在关闭选项卡时在某些情况下打开 HTML5 通知。
附加调试器告诉我 Notification 类未定义:
ReferenceError:未定义通知
根据 Mozilla 文档,不需要包含特殊的 JSM 即可使用通知。知道问题是什么,更重要的是,如何解决它?
我编写了一个 Firefox 附加组件,它可以很好地作为叠加层,但现在我将其转换为 boostrapped(无重启)。它注册一个选项卡侦听器,然后在关闭选项卡时在某些情况下打开 HTML5 通知。
附加调试器告诉我 Notification 类未定义:
ReferenceError:未定义通知
根据 Mozilla 文档,不需要包含特殊的 JSM 即可使用通知。知道问题是什么,更重要的是,如何解决它?
根据 Mozilla 文档,不需要包含特殊的 JSM 即可使用通知。
这仅适用于全局对象是 DOM 窗口的 javascript 上下文。自举插件在只有 ecmascript 定义的对象 ( Object
, Promise
, ...)Components
和其他一些定义的沙盒中运行。
检查调试器以查看该范围内的确切可用内容。
因此,如果您想使用 HTML5 API 或导入另一个具有类似功能的服务,例如alertservice ,您要么需要检索窗口对象(xul windows 也应该工作)
正如8472 所说,引导加载项不会自动访问全局window
对象。这与大多数 JavaScript 运行的上下文有很大不同。这是让相当多的人绊倒的事情。还需要注意的是,其中的代码bootstrap.js
可能在没有窗口存在的情况下运行,因此您无法获取。
如果存在浏览器窗口,您可以获得对最新浏览器window
、document
和的引用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;
}