5

クロスドメイン Ajax 呼び出しを行っています。

私のコード:

if (window.XDomainRequest) // Check whether the browser supports XDR.
{
    xdr = new XDomainRequest(); // Create a new XDR object.
    if (xdr) {
        xdr.timeout = 3000;//Set the timeout time to  3 second.
        xdr.onload = function () {
            alert("Success");
        };
        xdr.onerror = function () {
            alert("Error");
        };
        xdr.ontimeout = function () {
            alert("Error");
        };
        xdr.open("post", urlSearch);
        xdr.send();
    }
}
else {
    $.ajax({
        url: urlSearch,
        type: 'POST',
        dataType: 'json',
        timeout: 3000,
        success: function (data) {
            alert("Success");
        },
        error: function () {
            alert("Error");
        }
    });
}

上記のコードはすべてのブラウザーで問題なく動作しますが、IE では (aborted) のようなエラーが表示されることがあります。

このエラーを解決するために Google で検索しましたが、適切な解決策が見つかりませんでした。

(aborted) が表示されている場所にエラー メッセージが表示されます。 http://postimg.org/image/k01u6t9v5/

特定の URL に対して個別の呼び出しを行うと、(中止された) メッセージが表示されません (成功アラートを表示しています)。しかし、(画像のように)複数の呼び出しを行うと、そのタイプのエラーが表示されます。

この問題を克服するにはどうすればよいですか?

助けてください

前もって感謝します

4

1 に答える 1

9

これが同じ問題かどうかはわかりませんが、私の場合、これらすべてを設定する必要がありました。進行中; タイムアウト; そしてオンロード。この問題について説明している参考文献を次に示します。

他にもたくさんあります。それらは散在しており、提案された解決策が矛盾していることもあります。たとえば、xdr.send 呼び出しを setTimeout でラップすることが提案されています。

私が見た動作は、各イベント ハンドラー関数に空白以外のボディを追加することで解消されました。すべてが必要かどうかはわかりません。setTimeout ラッパーは絶対に必要ありませんでした。

おそらく関係のない情報の 1 つ: 私の場合、各ハンドラーを「this」オブジェクトにバインドすることにしました。また、関数の実装を追加して、コンパイラがそれらすべてを同じ空の関数に割り当てないようにしました。私のコードは POST ではなく GET を使用していました。YMMV。

あなたのコードは、1 つのハンドラーを未設定のままにします。

if (window.XDomainRequest) // Check whether the browser supports XDR.
{
    xdr = new XDomainRequest(); // Create a new XDR object.
    if (xdr) {
        xdr.timeout = 3000;//Set the timeout time to  3 second.
        xdr.onload = function () {
            alert("Success");
        };
        xdr.onerror = function () {
            alert("Error");
        };
        xdr.ontimeout = function () {
            alert("Error");
        };
        // this also needs to be set
        xdr.onprogress = function() {
            window.console.log('progress');
        };
        xdr.open("post", urlSearch);
        xdr.send();
    }
}
else {
    $.ajax({
        url: urlSearch,
        type: 'POST',
        dataType: 'json',
        timeout: 3000,
        success: function (data) {
            alert("Success");
        },
        error: function () {
            alert("Error");
        }
    });
}
于 2013-08-22T23:30:59.343 に答える