javascript - Services.wm 未定义(Firefox SDK 扩展)

标签 javascript firefox firefox-addon mozilla

我收到错误 TypeError: Services.wm is undefined ,当我使用 Firefox Addon SDK (JPM) 时,以及 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));
}

任何建议都会有很大帮助,谢谢。

最佳答案

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");

关于javascript - Services.wm 未定义(Firefox SDK 扩展),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567318/

相关文章:

javascript - 当用户刷新页面时,如何进行 angularjs $http POST 调用?

css - 省略号在 Internet Explorer 上运行不佳

javascript - 使 XUL 对话框窗口在不适合屏幕时显示滚动

javascript - 火狐扩展之谜

javascript - 通过类处理两个slideUp/Down

javascript - 使用图像映射时鼠标悬停时图像闪烁javascript

debugging - FireFox 和 html5 视频 - 带 x 的灰色框

android - jpm-mobile 失败并出现 ReferenceError : cmd is not defined

javascript - 无法从全局空间检索应用程序对象

Firefox 拒绝加载任何带有严格动态设置的脚本