我決定將這段代碼包含到一個對象中,以將它從它將要應用的區域中分離出來。這裏任何意見是真正的讚賞:如何檢查一個變量是否是Javascript中的超時?
appConfig.loadElement和appConfig.cerrorElement是這些HTML元素:
<div id="loading" style="display:none;">Loading...</div>
<div id="cerror" style="display:none;">Connection Error.</div>
var loadingTimeoutInstance = null, cerrorTimeoutInstance = null,
requestObj = {
reset: function() {
$(appConfig.loadElement).hide();
$(appConfig.cerrorElement).hide();
clearTimeout(loadingTimeoutInstance);
clearTimeout(cerrorTimeoutInstance);
},
initiate: function() {
loadingTimeoutInstance = setTimeout(requestObj.timeout, appConfig.loadingDelayMS);
},
timeout: function() {
clearTimeout(loadingTimeoutInstance);
$(appConfig.loadElement).show();
cerrorTimeoutInstance = setTimeout(requestObj.cerror, appConfig.cerrorDelayMS);
},
cerror: function() {
clearTimeout(cerrorTimeoutInstance);
$(appConfig.loadElement).hide();
$(appConfig.cerrorElement).show();
}
}
實現是像這樣:
當異步請求時:
requestObj.reset();
requestObj.initiate();
返回響應後:
requestObj.reset();
我發現的問題主要在requestObj.reset()中: - 爲什麼要隱藏元素(如果它們已被隱藏)? - 如果它們沒有設置爲超時,則無法清除超時變量(loadingTimeoutInstance和cerrorTimeoutInstance) - 這會導致它不起作用。
「重新隱藏」一個元素通常沒有問題;它會保存一個檢查(不會改變語義),因爲只有最後的狀態被關心。最後一點令人困惑的是:「如果它們沒有被設置爲暫停......導致它無法工作」......它以什麼方式不起作用?有一個小提琴測試案例? – 2012-06-06 23:28:35
我不知道爲什麼當我清除尚未設置的超時時它不起作用。其他幾次我都遇到過這個問題,這種情況就是其中之一。不過,艾倫的解決方案效果很好。關於隱藏一個已經隱藏的元素 - 它只是困擾我,因爲這在邏輯上沒有意義,我知道結果不受影響。感謝您的建議:) – TaylorMac