2010-09-01 54 views
9

你好,我注意到,這個簡單的代碼不工作,它應該工作的方式......

function test() { 
    $.ajax({ 
     'url' : 'test/GameConfiguration.json', 
     'dataType' : 'json', 
     data : { 
      a : 'aaa' 
     }, 
     cache : false, 
     method : 'get', 
     timeout : 10000, //10 secs of timeout 
     success : function(data, textStatus, XMLHttpRequest) { 
      console.log("success"); 
      if (data == null) 
       console.log("it's not a real success"); 
     }, 
     error : function(XMLHttpRequest, textStatus, errorThrown) { 
      console.log("error: " + textStatus); 
     } 
    }); 
} 

測試已在本地主機上運行,我的意思是:我加載頁面,關閉本地web服務器,然後我發起請求(通過一個簡單的按鈕,onclick指向這個函數)。錯誤不會被調用,我得到的是成功處理程序調用,它有textStatus =「success」和data = null。我甚至注意到請求在10秒之前超時。 這發生在Firefox(最新版本),Chrome(最新版本)和Safari 5.這是爲什麼?是否因爲我在本地主機上工作?


我忘了告訴:請求沒有被緩存。事實上,螢火蟲和Chrome開發工具都會顯示失敗的要求。


大更新

此行爲與使用本地主機。事實上,如果我從另一個同事PC加載此頁面,並在觸發請求之前斷開我的PC與網絡的連接,我將錯誤處理程序正確地啓用,並將超時設置爲狀態。我認爲這是jQuery的一個bug。這會讓我很難測試超時錯誤:(


傢伙從jQuery的論壇上說,這是由於網絡堆棧中止連接的方式,給定主機爲localhost,我測試了在Windows 7只是如果你覺得測試這個在其他系統上,你可以在jQuery的論壇,制定出一些jQuery的內部,報告這個帖子:

http://forum.jquery.com/topic/strange-and-unexpected-behaviour-of-ajax-error-and-localhost#14737000001331961

+2

做爲什麼你'「url''和'」引述字符串dataType''? – Codesleuth 2010-09-01 10:00:39

+0

我試圖刪除引號:沒有區別 – gotch4 2010-09-01 10:02:06

+0

你可以爲此顯示一個演示頁面嗎? – Nalum 2010-09-01 10:14:35

回答

7

UPDATED:嘗試將(data == null)替換爲(XMLHttpRequest.readyState === 4 && XMLHttpRequest.status === 0)

在W3C Candidate關於XMLHttpRequest的推薦標準中描述了它必須存在如此命名的「錯誤標誌」,它應該用來指示某種類型的網絡錯誤或墮胎。如果發生此類錯誤,XMLHttpRequest中的狀態將爲0而不是200(「OK」),201(「創建」),304(「未修改」)等。與http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute完全相符,在XMLHttpRequest.readyState等於0或1(「UNSENT」或「OPENED」)的情況下,XMLHttpRequest.status可以爲0。另一種情況是XMLHttpRequest.readyState等於4(「完成」)並且「錯誤標誌」爲真。如果我們沒有這兩種情況,則XMLHttpRequest.status必須是HTTP狀態碼。在http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htmlhttp://www.w3.org/Protocols/HTTP/1.0/spec.html#Status-Codes沒有HTTP狀態碼等於0,所以它似乎我的,你可以按照

jQuery(document).ready(function() { 
    $.ajax({ 
     type: 'GET', 
     url: 'test/GameConfiguration.json', 
     dataType: 'json', 
     cache : false, 
     success: function(data, textStatus, xhr){ 
      if (xhr.readyState === 4 && xhr.status === 0) { 
       // if readyState is DONE (numeric value 4) then corresponds to 
       // http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-done 
       // "The DONE state has an associated error flag that indicates 
       // some type of network error or abortion." 
       // Corresponds to http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute 
       // If error flag it true, xhr.status is 0. 
       alert('"error flag\" is true. It means that we have a network error"+ 
         " or abortion (for example because of Same Origin Policy restrictions)'); 
      } 
      else { 
       alert(textStatus); 
       alert(data); 
      } 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
      if (textStatus !== null) { 
       alert("error: " + textStatus); 
      } else if (errorThrown !== null) { 
       alert("exception: " + errorThrown.message); 
      } 
      else { 
       alert ("error"); 
      } 
     } 
    }); 
}); 
+0

謝謝,這聽起來更健壯。無論如何,我把所有這些發佈在jQuery論壇上,一些開發者開始關注這個。我甚至發送了一些調試日誌,可能這個東西會被修復。 – gotch4 2010-09-02 09:02:48

+0

@ gotch4:我在jQuery bug報告中找不到你的文章。你能發表參考嗎?我發現了一些其他類似的報道,如http://dev.jquery.com/ticket/6060。看起來,嘗試爲Opera提供解決方法的更改http://dev.jquery.com/changeset/6432錯誤地實現了,並且現在在其他瀏覽器中XMLHttpRequest.status = 0的情況下工作錯誤。如果你不這樣做。我會重申你在bug報告中插入參考文獻http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute。 jQuery的代碼至少應遵循標準,然後嘗試實施任何解決方法。 – Oleg 2010-09-02 14:38:01

-2

即使你關閉本地服務器,它應該還是能夠看到json文件..嘗試暫時刪除文件,看看是否有效。

+0

如果我刪除了文件並且服務器處於開啓狀態,當然我會得到一個404錯誤處理程序並觸發。 如果我刪除文件並且服務器關閉,結果相同。 – gotch4 2010-09-01 10:14:47

1

如果發生網絡錯誤,將調用success回調,而不是error,即使它沒有多大意義。詳情請參閱this blog post。所以基本上你通過檢查data == null是正確的。

+0

請看我的答案和代碼示例。你如何解讀結果?你認爲我們有jQuery中的錯誤嗎? – Oleg 2010-09-01 13:29:01

+0

不,您的測試是錯誤的:您正在更改端口號。由於同源策略限制,這是不允許的:http://en.wikipedia.org/wiki/Same_origin_policy。如果更改端口號,則無法執行AJAX查詢。 – 2010-09-01 14:19:06

+0

你是對的,我的第一個例子應該被解釋爲相同的「原產地策略限制」錯誤。我根據http://www.w3.org/TR/XMLHttpRequest編寫新版本的代碼,在我看來,這兩種情況都可以檢測到錯誤:「原始策略限制」或任何類型的網絡錯誤。在所有這些情況下,「成功」處理程序的調用應該被解釋爲錯誤。你對這個建議有什麼看法? – Oleg 2010-09-01 18:13:49