2011-09-21 54 views
6

我正在使用Prototype JS框架來執行Ajax調用。這裏是我的代碼:Ajax調用被瀏覽器取消

new Ajax.Request('/myurl.php', {method: 'post', postBody: 'id='+id+'&v='+foo, onSuccess: success, onFailure: failed}); 

function success(ret) { 
console.log("success",ret.readyState, ret.status); 
} 
function failed(ret) { 
console.log("failed",ret.readyState, ret.status); 
} 

大多數時候,這個工作正常,併成功函數調用的200約5%的Safari瀏覽器上的時間的狀態代碼成功函數被調用的狀態碼爲0.在這種情況下,當我查看網絡檢查器的「網絡」選項卡時,ajax呼叫的狀態爲「已取消」。我可以確認服務器日誌,請求永遠不會打到服務器。就好像ajax請求立即取消,甚至沒有嘗試連接到服務器。我還沒有找到任何可靠的方法來重現這一點,它似乎是隨機的。我做了20次,發生一次。

有誰知道會導致ajax調用取消或返回狀態碼0?

+0

您使用的是哪個版本的prototypejs? – jonycheung

回答

1

原因可能是您正在使用的http服務器和瀏覽器的組合。它看起來不像PrototypeJS庫的錯誤。

多個來源指出,HTTP連接的保持活動參數似乎在Safari中被破壞(請參閱here,herehere)。在Apache上,他們建議將此添加到配置中:

BrowserMatch "Safari" nokeepalive 

(請檢查服務器文檔中的相應語法)。

如果Safari與您的服務器處理嚴重的HTTP持久連接,它可能會解釋您的經歷。

如果對你來說不是太複雜,我會嘗試另一個HTTP服務器,每個操作系統上都有很多可用的。

儘管如此,我們缺少一點信息來完全回答您的答案。服務器問題是領先的,但可能有其他問題。很高興知道它在其他瀏覽器中是否也有相同的功能(Firefox與Firebug將顯示此類信息,Chrome,Opera和IE有開發內置工具箱)。另一個有效的問題是您每秒執行一次AJAX請求的頻率(如果相關)。

0

我知道這是一個老話題,但我想分享一個Safari解決方案,可能會爲他人節省一些時間。下面這行真的解決了所有的問題:

BrowserMatch "^(?=.*Safari)(?=.*Macintosh)(?!.*Chrom).*" nokeepalive gzip-only-text/html 

正則表達式可以確保只檢測到Mac上的Safari,而不是移動Safari和Chrome(IUM)和等。 Safari for Windows也不匹配,但Keepalive問題似乎只是一個Mac-Safari組合。另外,一些Safari版本不能很好地處理gzip的css/js。

我們的網站崩潰或CSS的所有症狀都沒有完全加載在不同版本的Safari中,這導致我幾乎拉我的頭髮(Safari真的是新的IE)已經爲我們解決了這個Apache的'配置黑客' 。