2013-06-27 42 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/