0

Firefox 拡張機能を作成する際に、ユーザーが「OK」ボタンを押したときに Javascript 関数を呼び出すダイアログがあります。その関数は次のようになります。

var acceptSubscribeHttpReq = null;
function acceptSubscribe(url) {
    acceptSubscribeHttpReq = new XMLHttpRequest();
    acceptSubscribeHttpReq.onload = httpLoadedSubscribe;
    acceptSubscribeHttpReq.onerror = httpErrorSubscribe;
    try {
        acceptSubscribeHttpReq.open("GET", url, true);
        acceptSubscribeHttpReq.send(null);
    } catch(e) {
        acceptSubscribeHttpReq.abort();
        return false;
    }
    // alert("request.status = "+acceptSubscribeHttpReq.status);
    return true;
 }

興味深いことに、(open の 3 番目の引数を false に設定して) 同期送信を使用するか、関数の最後でアラートのコメントを解除すると、これは正常に機能します。しかし、アラートのコメントを解除せずに非同期を使用すると、これは暗黙のうちに失敗します。期待どおりにこの関数から戻りますが、onload ハンドラーは決して起動しません。

これは、関数の終了時に XMLHttpRequest オブジェクトが破棄されていることを示しているようです。あれは正しいですか?これはボタンから呼び出されているためですか?もしそうなら、可能な解決策は何ですか?そうでない場合、なぜこれが起こっているのか考えられますか?

ダイアログの XUL は次のとおりです。

<dialog id="winMain" title="&settingWindow.title;" style="min-width:400px;"
    onload="initSubscribe();" ondialogaccept="return acceptSubscribe();"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

ありとあらゆる助けに感謝します!

4

1 に答える 1

0

リクエストのフィールドステータスは、リクエストが終了した後にのみ存在します (onload / onerror)。リクエストが確定する前にこのフィールドにアクセスしようとすると、そのようなフィールドが存在しないため、エラーが発生します。

于 2013-04-11T17:45:15.980 に答える