我在使用Firefox Addon SDK(JPM)时遇到错误TypeError: Services.wm is undefined
,以及index.js
中的以下代码:
var self = require("sdk/self");
const { Cu } = require("chrome");
let Services = Cu.import("resource://gre/modules/Services.jsm");
require("sdk/ui/button/action").ActionButton({
id: "list-tabs",
label: "List Tabs",
icon: "./icon-16.png",
onClick: myTestFunc
});
function myTestFunc() {
var windows = Services.wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements())
iterateWindows(windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindow));
}
任何建议都会有很大的帮助,谢谢。
答案 0 :(得分:1)
Cu.import无法正常工作。它的返回值是导入模块的全局对象。
通常,模块的导出符号作为第二个对象的属性(如果已指定)导入,如果不导入,则导入当前全局,这将定义Services
,然后立即用返回值替换。
只使用Cu.import("resource://gre/modules/Services.jsm", this);
而没有返回值,就可以使用并导入该模块中的所有导出符号。
使用destructuring assignment的以下表单有效,但不鼓励,因为它到达目标模块的全局并获取常量而不是仅访问导出的符号:
const {Services} = Cu.import("resource://gre/modules/Services.jsm", {});
SDK正确执行此操作的方法是
const {Services} = require("resource://gre/modules/Services.jsm");