2011-09-21 36 views
0

這個問題應該是非常熟悉的人寫的或測試自動完成接口使用JavaScript,(實時ajax東西)。終止jQuery.ajax()事件(我的意思是終止ajax連接到服務器)

我正在編寫實時表單驗證。用戶正在鍵入他的用戶名,他可以在鍵入時看到「OK」或「已接受」按摩。

的問題是:

1)我在每一個keyup()change()事件

2)因此,當快速用戶各類火災$.ajax()和連接速度慢可能有很多連接打開的。所有這些除了最後一個不是局部和需要終止

3)另外,ping命令服務器可以改變,例如從100毫秒至400毫秒,所以不是局部的答案放在最後(!)

肯定必須修復。

我該怎麼辦?

回答

0

是否符合您的要求,要做到這一點最簡單的方法可能是使用標準JQuery UI Autocomplete plugin。這爲您處理管道。

對於更復雜的要求,你可以滾你自己。這bindWithDelay plugin推遲按鍵事件是非常方便的。正如@Vlad所指出的,在觸發Ajax查詢時,請務必保留對jqXHR對象的引用,以便在發出第二個請求時取消該請求。

if (jqXHR && jqXHR.readyState !== 4) { 
    jqXHR.abort(); 
} 

jqXHR = $.ajax({ 
    ... 
}); 

請注意,即使Ajax請求被中止,服務器仍將繼續處理請求,因此您仍將使用服務器資源。當然,在你的Ajax cal的錯誤處理程序中,一定要忽略在status === "abort"之處引起的錯誤。

+0

特別感謝細節。 – Dan

0

雖然一些Ajax庫支持中止請求,我會盡量多一點謹慎和先發制人水浸的連接。

因爲我不認爲你會看到取消請求,一個巨大的性能改進,

最有可能服務器已經發送數據包的時候,就會消耗帶寬兩種方式。

一個簡單的方法來防止垃圾郵件的請求被放在引發新的請求(200ms的說),那麼如果超時重新啓動定時器之前,對課程的一些最大閾值一個新的請求被觸發稍有延遲。

例如1:1的配額每秒最小。

這也將防止雙觸發,你會從捕獲2個冗餘事件得到。