2013-06-27 74 views
0

標題可能會引起誤解,但它基本上是我需要完成的。中止JavaScript setTimeout函數

我有一個AJAX「加載」文本,如果服務器花了超過15秒的時間來響應,我想更新它。

下面是代碼:

$(".loader").html('Loading'); 
$(".loader").show(); 
setTimeout(function() { 
    if ($('.loader').is(":visible")) { 
     $(".loader").html('Click <a href="javascript:location.reload()">here</a> to reload.</span>'); 
    } 
}, 15000); 

有沒有更好的方法嗎?當我最終致電$(".loader").hide();時,我希望setTimeout計數器被中止。可能嗎?

+1

點擊https://developer.mozilla.org/en-US/docs/Web/API/window.clearTimeout – elclanrs

回答

5

當然。 setTimeout返回一個值,您可以傳遞給clearTimeout以停止超時。

var handle = setTimeout(function() { 
    alert("Oh noes, I ran!") 
}, 5000) 

clearTimeout(handle) 
-1

我會建議縮短週期(1秒),並在您調用的函數內增加計數器。然後,您可以在成功加載或計數器閾值(以先到者爲準)退出。

+0

'setTimeout'!='setInterval',並且一個計數器會_either_需要一個閉包(這在這種情況下是矯枉過正的)或一個全局變量,它是_evil_,無論如何 –

+0

@EliasVanOotegem我知道這些函數。我做了,我之前提出的。這不是一個地方,你爭辯說,全局變量還是'goto'運算符或'eval()'是否是邪惡的。每個工具都適合它的任務。 –

+1

噢來吧...儘管向下投票?真?我甚至沒有回答你的答案,但我剛剛評論過,因爲我受不了DV的解釋......我只是想幫助你理解爲什麼有些人可能會發現你的方法適得其反,甚至是「壞習慣」 。 PS:當涉及到'eval'是邪惡的時候:現在沒有討論過JSON.parse已經在所有瀏覽器中實現了...我寫了9年的代碼,其中4個專業,我已經永遠不需要'eval' ... –

0

可以使用clearTimeout功能:

$(".loader").html('Loading'); 
$(".loader").show(); 
var timerId= setTimeout(function() { 
    if ($('.loader').is(":visible")) { 
     $(".loader").html('Click <a href="javascript:location.reload()">here</a> to reload.</span>'); 
    } 
}, 15000); 

$(".stop").click(function() { 
    clearTimeout(timerId); 
    $(".loader").html("done"); 
}); 

看到這個小提琴:http://jsfiddle.net/KaNUP/