“XMLHttpRequest 不是构造函数”错误,与浏览器 chrome 内部使用的 Mozilla 文档相反

"XMLHttpRequest is not a constructor" error, contrary do Mozilla docs on usage inside browser chrome

本文关键字:内部 Mozilla 文档 chrome 浏览器 XMLHttpRequest 构造函数 错误      更新时间:2023-09-26

我正在使用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"模块导入的任何属性快捷方式(分别为"类"、"接口"、"管理器"、"结果"和"utils"属性的"Cc"、"Ci"、"Cm"、"Cr"和"Cu"。components Components对象本身)。

好的

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

任何帮助非常感谢。

您应该使用附加 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(!) 信息根本不正确。我现在编辑了文章并设置了"需要技术审查"标志。

或者:

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

有关详细信息和限制,请参阅这些文档。

我像这样导入它:

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

但我使用了 Node.js...