1

我正在使用 AddOn SDK 构建一个 Mozilla AddOn。我需要做一个 AJAX 帖子,所以我使用XMLHttpRequest. 在Mozilla 的文档中,它说XMLHttpRequest

无法使用 XMLHttpRequest() 构造函数进行实例化。构造函数未在组件内部定义,代码会导致错误。解决此问题的最佳方法是使用 XPCOM 组件构造函数。

文档说这样做:

const XMLHttpRequest = Components.Constructor["@mozilla.org/xmlextras/xmlhttprequest;1"];
var oReq = new XMLHttpRequest();

美好的。所以我完全按照文档中显示的方式实现代码:

var { Cc, Cu, Ci, Cr, Cm, components } = require('chrome');
const XMLHttpRequest = components.Constructor["@mozilla.org/xmlextras/xmlhttprequest;1"];
. . .
var oReq = new XMLHttpRequest();

我在这一行得到“ XMLHttpRequest 不是构造函数”错误。

我错过了什么?我在这里做错了什么?我不能使用“ Components.Constructor["@...”方式,因为生成.xpi文件的 AddOn SDK CLI 工具会抱怨,说

使用“组件”访问 chrome 权限。为此,您需要添加类似于以下内容的行:

const {components} = require("chrome");

然后,您可以使用从“chrome”模块导入的属性的任何快捷方式(“类”、“接口”、“ manager'、'results' 和 'utils' 属性。以及components对象Components本身)。

好的。我确实require(chrome)在我的文件顶部有调用,并生成快捷方式,然后 amusing components,这是正确的形式,并且来自 AddOn 编译器的消息说要使用它。然而我得到了错误。

非常感谢任何帮助。

4

3 回答 3

3

您应该使用附加 SDK 中的request模块

如果您出于某种原因仍想nsIXMLHttpRequest直接使用,请注意在 SDK 模块中生成构造函数的正确方法是:

XMLHttpRequest = components.Constructor(
  "@mozilla.org/xmlextras/xmlhttprequest;1",
  "nsIXMLHttpRequest");

除了这components.Constructor()在 SDK 中似乎不起作用。所以最好直接创建一个实例:

var {Cc, Ci} = require('chrome');
var r = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
        createInstance(Ci.nsIXMLHttpRequest);
r.open("GET", "http://example.org/");
r.addEventListener("loadend", function(e) {
    console.log(this, e, e.type, this.responseText);
});
r.send();

MDN wiki(!) 信息完全不正确。我现在编辑了这篇文章并设置了“需要技术审查”标志。

于 2013-09-18T19:18:56.563 回答
3

或者:

const { XMLHttpRequest } = require('sdk/net/xhr');

let r = new XMLHttpRequest();

console.dir(r);
r.open("GET", "http://example.org/");
r.addEventListener("loadend", function(e) {
    console.log(this, e, e.type, this.responseText);
});
r.send();

有关更多信息和限制,请参阅这些文档

于 2013-09-18T21:22:26.407 回答
0

我是这样导入的:

var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;

但是我使用了 Node.js ......

于 2021-11-27T08:36:54.510 回答