6

IE プラグインを介してすべてのページに挿入される iframe から ajax リクエストを作成しています。IE ではjQuery の ajax が失敗するため、 IE のクロス ドメイン リクエストを使用しています。これは IE8 と 9 で 75% の時間で動作します。残りの 25% では起動xdr.onloadすらしません。

サーバーphpはその仕事をしています...ログは、いつ起動するか、起動onloadしないかについて同じように見えます。また、xdr.onerror発火もしません。

何か案は?

        thisURL = "http://example.com/getmsg.php?cmd=getMessage&iid=ddeb2c1228&uurl=http%3A%2F%2Fwww.cnn.com%2F&t=" + Math.random(); 

        // Use Microsoft XDR
        var xdr = new XDomainRequest();
        xdr.open("GET", thisURL);
        xdr.onload = function() {
            // this is sometimes called, sometimes not in IE
            alert('INCONSISTENT ALERT');
            callback(xdr.responseText);
        };
        xdr.send();
4

5 に答える 5

9

私は非常によく似た問題を抱えていました.Fiddlerがすべての要求と応答ヘッダーが意図したとおりに送信されていることを示しているにもかかわらず、XDomainRequestsが時々失敗する. これらの XDR オブジェクトにすべてのイベント ハンドラーとタイムアウト プロパティを定義しましたが、どのハンドラーも呼び出されませんでした。F12 開発者ツールは、リクエストが中止されたと表示しました。複数の異なるドメインに対して、GET と POST の両方が中止される可能性がありますが、最初の要求は常に正常に機能していました。

次に、次のように呼び出しをxdr.sendタイムアウトにしてみました。

setTimeout(function () {
    xdr.send();
}, 0);

そしてそれはうまくいきました。理由はわかりませんが、おそらくこれは他の誰かに役立つでしょう。

于 2011-07-14T19:52:36.330 に答える
7

ここでタイトルを付けたのは正しいです。経験はかなり一貫性がありません。それを見てみましょう...

var xdr, err, res, foo, url;

xdr = new XDomainRequest();

err = function(){ alert("There was an error, operation aborted"); }
res = function(){ alert("Success! " + xdr.responseText); }
foo = function(){ return; }

url = "http://hello.com/here/is/the/url/?query=true&whatever=asd";

xdr.onerror = err;
xdr.ontimeout = foo;
xdr.onprogress = foo;
xdr.onload = res;
xdr.timeout = 5000;

xdr.open("get", url);
xdr.send(null);

XDomainRequest オブジェクトの処理は、IE ごとに異なります。

IE9 -> XDomainRequest オブジェクトでは、すべてのハンドルにメソッドを指定する必要があります。つまり、onerror、onload、ontimeout、onprogress などのハンドルはすべて、何かを行うように指定されています。これらのハンドルのメソッドを定義しないと、「操作が中止されました」というネットワーク応答が返されます。

IE7/8/9 では -> XDomainRequest はデフォルトで ASYNC です。xdr オブジェクトが完了するかどうかに関係なく、スタックのさらに下のコードを実行します。setTimeout を置くことは解決策かもしれませんが、そうすべきではありません。

この場合、イベントをトリガーし、それ以上のコードを実行する前にイベントをリッスンします。これの例は(jqueryで)...

// call this method in xdr onload
$(document).trigger("xdr_complete");

// use this wrapper in code you want to execute after the complete of xdr
$(document).bind("xdr_complete", function(){ ... });

IE7/IE8 では、動作していることに気付くでしょう。IE7 と IE8 は、ハンドルのメソッドが欠落している場合に中断しないという点で、どちらかというと「ルーズ」です。

于 2012-06-19T15:57:54.897 に答える
4

土壇場で問題を発見しました。私の場合、リクエストがタイムアウトしていなくても、タイムアウト値を指定する必要がありました。XDR の問題を適切にデバッグするために、次のコードをお勧めします。各アラートは、コードで何が起こっているかを示します。おっしゃる通り、私の場合はtimeout申告漏れでした。ただし、以下のコードは XDR の問題をデバッグする必要があります。

       var xdr = new XDomainRequest();
            if (xdr) {
                xdr.onerror = function () {
//                    alert('xdr onerror');
                };
                xdr.ontimeout = function () {
//                    alert('xdr ontimeout');
                };
                xdr.onprogress = function () {
//                    alert("XDR onprogress");
//                    alert("Got: " + xdr.responseText);
                };
                xdr.onload = function() {
//                    alert('onload' + xdr.responseText);
                    callback(xdr.responseText);
                };
                xdr.timeout = 5000;
                xdr.open("get", thisURL);
                xdr.send();
            } else {
//                alert('failed to create xdr');
            }
于 2011-03-23T20:21:15.807 に答える
0

ここで決定的な答えを出すのは難しいです。

まず、Fiddlerを使用して、何らかのネットワーク障害が発生しているかどうかを確認してください。リクエストが実際に行われたかどうか、およびサーバーからの応答を理解するのに役立ちます。

次に、これが当てはまるかどうかはわかりませんが、最近、IE のクロス ドメインで問題が発生しました。このコードは、他のブラウザー (Firefox、Safari、および Chrome) でも正常に機能しました。その場合の問題は、要求が予期された 404 を返していることが判明しました。いずれにせよ、IE はその時点ですべての実行を停止し、404 イベントのエラー処理も発生しませんでした。だから、あなたはここで同じものを手に入れることができます. Firefox、Safari などはすべて、スクリプトを続行させます。エラーを返す場合は、代わりにエラー値で成功を返したい場合があります。

于 2011-03-18T13:35:14.883 に答える
0
  • まず、onerror ハンドラを追加して、デバッグを行います。それらをログに記録して、正確に何が起こるかを確認してください。
  • 第二に、あなたの「math.random」アプローチには欠陥があります。より良いオプションは、new Date().getTime() を使用することです。これにより、時間が経過しても一意のリクエストが確実に得られます。
  • 第三に、POST メソッドを使用して IE の明らかに標準に基づいた動作をバイパスすることができます (;-) )
于 2011-03-23T18:10:07.143 に答える