6

jQuery 1.4.2 を使用しており、単純な AJAX リクエストを実行しようとしています。ターゲット URL は JSON 文字列を返します (jslint で検証しました)。リクエストは Firefox と Chrome では機能しますが、IE8 では機能したくありません。その理由はわかりません。呼び出しは次のとおりです。

jQuery.ajax({
url: 'http://' + domain + '/' + 'helper/echo/',
dataType: 'json',
success: function(data) {
 alert(data);
},
beforeSend: function(request, settings) {
 alert('Beginning ' + settings.dataType + ' request: ' + settings.url);
},
complete: function(request, status) {
 alert('Request complete: ' + status);
},
error: function(request, status, error) {
 alert(error);
}
});

IE は beforeSend コールバックとエラー コールバックを実行します。エラー コールバックは、次のメッセージで警告します。

Error: This method cannot be called until the open method has been called.

私の応答ヘッダーはContent-Type: text/javascript; charset=UTF-8.

IE で何が起こっているのですか? localhost でサーバーを実行して、http://localhost:8080/psxからhttp://localhost:8080/helperにリクエストを送信しています。IE がこのリクエストをブロックしている可能性がありますか? リクエスト トラフィックを分析するために Fiddler をインストールしようとしましたが、私のマシンでは動作しません。Firebug は許可してくれますが、すべて問題ないようです。

助けてくれてありがとう!!!

4

1 に答える 1

14

よし、ここで修正だ!リクエストは を使用しwindow.XMLHttpRequest()ていましたが、何らかの理由で IE8 で正しく動作していません。jQuery は本来の状態にフェールバックしwindow.ActiveXObject("Microsoft.XMLHTTP")ていません。

これをスクリプトの AJAX 呼び出しの前のどこかに追加します (IE8 でのみ検証され、他の IE では検証されません):

jQuery.ajaxSetup({
            xhr: function() {
                    //return new window.XMLHttpRequest();
                    try{
                        if(window.ActiveXObject)
                            return new window.ActiveXObject("Microsoft.XMLHTTP");
                    } catch(e) { }

                    return new window.XMLHttpRequest();
                }
        });

これが私が解決策にたどり着いた方法です:

  1. 問題が修正済みのバグである場合に備えて、jQuery 1.4.4 に更新しました。
  2. 結果が大幅に異なるように見えるまで、Firebug デバッガーと DevTools デバッガーをステップ実行しました。
  3. 5899 行目の ajax() 関数は、xhr() 関数を使用して XmlHttpRequest オブジェクトを作成します。Firefox では、適切なデータが返されていました。IE では、これはすべてのフィールドがError: This method cannot be called until the open method has been called.
  4. この関数を 5749 行目で分析しました。return new window.XMLHttpRequest();
  5. 私はグーグルで検索し、同じ問題を抱えているこのページに出くわし、私にとって有効な解決策を提案しました.
  6. 公式 jQuery チケット:
于 2010-12-30T15:47:34.817 に答える