2011-01-07 136 views
2

更新1:我還沒有弄清楚發生了什麼事情,但這肯定是我的項目的一個問題。在創建一個簡單的測試頁之後,我能夠驗證getJSON實際上是否返回了它應該的XHR對象。jQuery Ajax方法不返回XHR對象

UPDATE 2:哇,這很奇怪。在做了更多測試之後,我發現如果我指定「callback =?」參數在URL字符串XHR對象不正確地返回。但是,如果我沒有指定「callback =?」參數,XHR對象正確返回。問題是,我在調用JSONP服務,所以「callback =?」參數是必需的。

有關爲什麼會出現這種情況的任何想法?

更新3:以下是一些獨立代碼示例來說明問題。在第一個示例中,console.log(request)未定義。當我在第二個代碼示例中硬編碼回調參數時,console.log(request)是XHR對象。

<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready(function() { 
       var request = $.getJSON('http://localhost?callback=?', function(data) { 

       }); 
       console.log(request); 
      }); 
     </script> 
    </body> 
</html> 

<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready(function() { 
       var request = $.getJSON('http://localhost?callback=callback', function(data) { 

       }); 
       console.log(request); 
      }); 
     </script> 
    </body> 
</html> 

UPDATE 4:每regilero的評論下面,我切換到使用$阿賈克斯方法,並通過一個數據對象傳遞的參數了。下面是請求的全部代碼:

var request = $.ajax({ 
    data: { 
     f: 'json', 
     geometry: '{x:44.203642291681845,y:-95.79085806500001}', 
     geometryType: 'esriGeometryPoint', 
     imageDisplay: '727,500,96', 
     layers: 'all', 
     mapExtent: '-179.462733065,16.116769346042226,-51.669764315000016,71.57609342040729', 
     returnGeometry: false, 
     tolerance: 10 
    }, 
    dataType: 'jsonp', 
    success: function(data) { 
     console.log(data); 
    }, 
    url: 'http://server.arcgisonline.com/ArcGIS/rest/services/Specialty/Soil_Survey_Map/MapServer/identify' 
}); 
console.log(request); 

如果我指定「數據類型:‘JSONP’」的配置對象,執行console.log(請求)再次定義。但是,如果我指定「dataType:'json'」,則console.log(request)是XHR對象。

此行爲與我使用$ .getJSON快捷方式時遇到的情況一致。


原來的問題

%的計算器問題/答案在這裏:Abort Ajax requests using jQuery和一些其他問題/本網站和其他人的答案,jQuery的Ajax的方法應該返回XHR對象。

但是,當我運行下面的代碼時,請求是「未定義的」。

var request = $.getJSON(url, function(data) { 
    console.log(data); 
}); 

console.log(request); 

我錯過了jQuery的變化嗎?我正在使用1.4.4。

+0

根據手冊,它應該還是回到一個XHR對象。 http://api.jquery.com/jQuery.getJSON/也許請求失敗? – 2011-01-07 21:31:19

+0

@皮卡:不,請求絕對不會失敗。 – 2011-01-07 21:38:33

+0

對,對不起。我誤解了這個問題。 – Anders 2011-01-07 21:40:05

回答

4

jsonp不使用XMLHTTPRequest。這是適用於所有XMLHTTPRequests的同源策略的解決方法;它通過將<script>標籤插入到DOM中來工作,請求服務器返回由callback=?參數表示的JS函數中包裝的JSON對象。

由於未使用XMLHTTPRequest,因此不會返回該類型的對象。

0

錯誤的答案。忽略此帖。

$ .getJSON不返回任何值。相反,它會獲取提交的URL的響應,並將其轉換爲JSON對象,並在傳遞給它時將其傳遞給回調。 檢查URL:[鏈接文本] [1] [1]:http://api.jquery.com/jQuery.getJSON/ 的getJSON方法骨架(按照jQuery的網站): > jQuery的。 getJSON(url,[data],[ > callback(data,textStatus,xhr)]) > > urlA包含發送請求的URL的字符串。 > > dataA將映射或字符串發送到具有請求的服務器。 > > callback(data,textStatus,xhr)A >如果 >請求成功,則執行回調函數。
+0

根據您鏈接的文檔,getJSON確實會返回XmlHttpRequest。看看標題,在右側。 – 2011-01-07 21:37:05

0

$ .getJSON是$ .ajax()的縮寫,像大多數簡寫的$ .ajax()那樣沒有默認的錯誤處理程序。嘗試使用$ .ajax並相應地設置錯誤處理程序。 Maye在你的Json語法中有些錯誤。而你正處於'沉默失敗'問題。

文件摘錄:

重要:對於jQuery 1.4,如果 JSON文件包含語法錯誤, 請求通常會失敗默默。 由於這個原因,避免頻繁手動編輯JSON 數據。 JSON是 數據交換格式,其語法規則 比JavaScript的對象字面表示法更嚴格。 例如,所有以JSON表示 的字符串,無論它們是屬性 還是值,都必須包含在 雙引號中。有關JSON 格式的詳細信息,請參見http://json.org/

0

$.getJSON函數是異步的,即使JSON請求尚未完成,它仍將繼續運行通過腳本。您的console.log(request);可能在請求返回之前運行,因此它可能沒有xhr對象。

我不知道這是肯定的,但這是一個想法。

編輯:下面是我的,我知道錯了
XHR對象作爲第三個參數傳遞給回調函數原來的答覆。如果你想要它,你需要使用這個:function(data, statusText, xhr) {而不是這個function(data) {

現在,如果您的成功回調沒有被調用,那是另一回事。嘗試在回調中添加alert(statusText);以確保它被調用。如果未被調用,請按@regilero提及,並使用$.ajax並傳遞一個錯誤處理程序來查看是否有任何錯誤消息彈出。

0

第一個答案是錯的其實你可以終止Ajax請求;)

$.ajax({ 
    url: "/event/search/list-event.html", 
    data:{ 
     page: 1 
    }, 
    beforeSend: function(xhr) 
    {  
     if(window.eventListXhr != null){ 
      window.eventListXhr.abort(); 
     } 
     window.eventListXhr = xhr; 
    }, 
    success: function(data) { 
     // .... 
    } 
});