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#">
ありとあらゆる助けに感謝します!