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["@...生成する AddOn SDK CLI ツールが、.xpi

「コンポーネント」を使用してクロム権限にアクセスします。そのためには、次のような行を追加する必要があります。

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

次に、「chrome」モジュールからインポートしたプロパティへのショートカットを使用できます (「classes」、「interfaces」、「 manager'、'results'、および 'utils' プロパティ、およびcomponentsオブジェクトComponents自体)。

いいよ。require(chrome)ファイルの先頭に呼び出しがあり、ショートカットを生成してから amous を生成します。componentsこれは正しい形式であり、アドオン コンパイラからのメッセージで使用するように指示されています。それでもエラーが発生します。

どんな助けでも大歓迎です。

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 に答える