2013-03-14 131 views
2

我試圖做一個AJAX請求到公共服務IE上的AJAX POST請求失敗,錯誤爲「No Transport」?

下面的代碼:

$.ajax({ 
    url : "http://api.geonames.org/citiesJSON", 
    type : 'POST', 
    cache : false, 
    dataType : 'json', 
    data : { 
     username: "demo", 
     north:10, 
     south: 10, 
     east:10, 
     west:10} 
}).done(function(data) { 
    alert("Success: " + JSON.stringify(data)); 
}).fail(function(a, b, c, d) { 
    alert("Failure: " 
      + JSON.stringify(a) + " " 
      + JSON.stringify(b) + " " 
      + JSON.stringify(c) + " " 
      + JSON.stringify(d)); 
}); 

你可以嘗試在此鏈接:http://jsfiddle.net/hDXq3/

響應檢索成功在Chrome & Firefox和輸出如下:
enter image description here

但對於如圖1E所示,將失敗強麥rting:
失敗:{ 「readyState的」:0, 「狀態」:0, 「狀態文本」: 「沒有交通」} 「錯誤」, 「無傳輸」 未定義

enter image description here

爲什麼它的不工作在IE瀏覽器?以及如何解決這個問題?

回答

8

下面是那些有興趣誰的解決方案:

if (!jQuery.support.cors && window.XDomainRequest) { 
    var httpRegEx = /^https?:\/\//i; 
    var getOrPostRegEx = /^get|post$/i; 
    var sameSchemeRegEx = new RegExp('^'+location.protocol, 'i'); 
    var xmlRegEx = /\/xml/i; 

    // ajaxTransport exists in jQuery 1.5+ 
    jQuery.ajaxTransport('text html xml json', function(options, userOptions, jqXHR){ 
     // XDomainRequests must be: asynchronous, GET or POST methods, HTTP or HTTPS protocol, and same scheme as calling page 
     if (options.crossDomain && options.async && getOrPostRegEx.test(options.type) && httpRegEx.test(userOptions.url) && sameSchemeRegEx.test(userOptions.url)) { 
      var xdr = null; 
      var userType = (userOptions.dataType||'').toLowerCase(); 
      return { 
       send: function(headers, complete){ 
        xdr = new XDomainRequest(); 
        if (/^\d+$/.test(userOptions.timeout)) { 
         xdr.timeout = userOptions.timeout; 
        } 
        xdr.ontimeout = function(){ 
         complete(500, 'timeout'); 
        }; 
        xdr.onload = function(){ 
         var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType; 
         var status = { 
          code: 200, 
          message: 'success' 
         }; 
         var responses = { 
          text: xdr.responseText 
         }; 

           try { 
            if (userType === 'json') { 
             try { 
              responses.json = JSON.parse(xdr.responseText); 
             } catch(e) { 
              status.code = 500; 
              status.message = 'parseerror'; 
              //throw 'Invalid JSON: ' + xdr.responseText; 
             } 
            } else if ((userType === 'xml') || ((userType !== 'text') && xmlRegEx.test(xdr.contentType))) { 
             var doc = new ActiveXObject('Microsoft.XMLDOM'); 
             doc.async = false; 
             try { 
              doc.loadXML(xdr.responseText); 
             } catch(e) { 
              doc = undefined; 
             } 
             if (!doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length) { 
              status.code = 500; 
              status.message = 'parseerror'; 
              throw 'Invalid XML: ' + xdr.responseText; 
             } 
             responses.xml = doc; 
            } 
           } catch(parseMessage) { 
            throw parseMessage; 
           } finally { 
            complete(status.code, status.message, responses, allResponseHeaders); 
           } 
          }; 
          xdr.onerror = function(){ 
           complete(500, 'error', { 
            text: xdr.responseText 
           }); 
          }; 
          xdr.open(options.type, options.url); 
          //xdr.send(userOptions.data); 
          xdr.send(); 
         }, 
         abort: function(){ 
          if (xdr) { 
           xdr.abort(); 
          } 
         } 
        }; 
       } 
      }); 
    }; 

jQuery.support.cors = true; 

$.ajax({ 
    url : "http://api.geonames.org/citiesJSON", 
    crossDomain: true, 
    type : 'POST', 
    cache : false, 
    dataType : 'json', 
    data : { 
     username: "demo", 
     north:10, 
     south: 10, 
     east:10, 
     west:10} 
}).done(function(data) { 
    alert("Success: " + JSON.stringify(data)); 
}).fail(function(a, b, c, d) { 
    alert("Failure: " 
      + JSON.stringify(a) + " " 
      + JSON.stringify(b) + " " 
      + JSON.stringify(c) + " " 
      + JSON.stringify(d)); 
}); 

您可能會嘗試在此鏈接:http://jsfiddle.net/bjW8t/4/

+0

我在我的代碼中試過你的例子,但我得到一個500內部服務器錯誤。它在其他瀏覽器中工作得很好,但在IE9中沒有問題 – 2014-09-18 11:40:24

+3

我收到錯誤「訪問被拒絕」。 – Chirag 2015-05-20 12:25:51

+1

這是唯一讓我的ie9 ajax請求正常工作。添加ajax Transport擴展(Moonscript)對我無效 – 2016-09-01 17:16:52