3

私は ajax 呼び出しを IE9 で適切に動作させようとしています。ネットワーク データで、リクエストが正常に処理されていることがわかります。また、jQuery の $.ajax() 呼び出しによって返される jqXHR オブジェクトには、応答データが含まれています。それでも、私の成功/エラー/完全なコールバックは発生しません。これがコードです...

私のスクリプトの上部に:

// override xhr for browser that use XDR
if ('XDomainRequest' in window && window.XDomainRequest !== null) {

  // override default jQuery transport for IE
  jQuery.ajaxSettings.xhr = function() {
      try { return new XDomainRequest(); }
      catch(e) {
        console.log('test'); 
      }
  };

  // Maybe a 304 response is causing the callbacks not to fire?
  // This makes sure I'm getting 200
  jQuery.ajaxSettings.cache = false;

  // also, override the support check
  jQuery.support.cors = true;
}

それから私の ajax 呼び出し...かなり明白です。

$.ajax({
    url: url,
    success: success,
    complete: complete,
    beforeSend: beforeSend,
    error: error
});

function success(response, textStatus, jqXHR){
    console.log('success');
    if( typeof fn == 'function'){
        fn(response.data);
    } else {
        console.log('Invalid callback supplied for dataGateway');
    }
}

function error(jqXHR, textStatus, errorThrown){
    console.log("Could not retrieve data from API.");
    return;
}

function complete(jqXHR, textStatus){
    console.log('complete');
}

// This is the only callback that gets fired
function beforeSend(jqXHR, settings){
    console.log('before send');
}

これをトラブルシューティングする方法を知っている人はいますか?

4

2 に答える 2

2

これが役立つかどうかはわかりませんが、これは私のajax呼び出しの例です。

    $.ajax({
        url: "http://myurl.com",
        type: "POST",
        dataType: "xml",
        data: GetCurrentUserSoapEnv, //my variable containing the xml I sending
        complete: processResult, //the function to call on completion
        contentType: "text/xml; charset=\"utf-8\""
});
于 2012-06-28T22:37:45.573 に答える
0

これはあなたが探していたものとは異なるアプローチであり、すでに問題を解決している可能性がありますが、最近、同様のIE互換性の問題を扱っていたので、XDomainRequestの組み込みハンドラーを使用する方が簡単だと思います。

標準に準拠することを拒否するブラウザーを例外とするのは不快なことですが、私のプロジェクトでは、状況を説明するために次のようなものを使用します。

    // This is necessary due to IE<10 having no support for CORS.
function fallbackXDR(callObj) {
    if (window.XDomainRequest) { 
        var xdrObj = new XDomainRequest();
        xdrObj.timeout = callObj.timeout;
        xdrObj.onload = function() {
            success({data:xdrObj.responseText});
            complete();
        };
        xdrObj.onerror = function() {
            error(xdrObj);
        };
        xdrObj.ontimeout = function() {
            callObj.xdrAttempts = callObj.xdrAttempts++ || 1;
            if (callObj.xdrAttempts < callObj.maxAttempts) {
                fallbackXDR(callObj);
            }
        };
        xdrObj.onprogress = function() {
            // Unfortunately this has to be included or it will not work in some cases.
        };

        // Use something other than $.param() to format the url if not using jQuery.
        var callStr = callObj ? '?'+$.param(callObj.urlVars) : '';
        xdrObj.open("get", callObj.url+callStr);
        xdrObj.send();
    } else {
        handleError("No XDomainRequest available.", callObj);
    }
}//fallbackXDR()
于 2013-01-07T00:17:04.740 に答える