setTimeout函数挂起我的浏览器?

时间:2011-02-24 20:26:32

标签: javascript jquery datetime

我使用java脚本显示时间。

function showTime()
{
    setTimeout("showTime()", 500);      
    var now = new Date();
    var f_date = now.getDate()+" "+strMonth(now.getMonth())+" "+now.getFullYear()+" / "+timeFormat(now.getHours(), now.getMinutes());
    if (document.getElementById('foobar') == null)
    {
        showTime();
    }
    document.getElementById('foobar').innerHTML = f_date;

}

function strMonth(m)
{ ............ }

function timeFormat(curr_hour, curr_min)
{--------------}

showTime();

我的Browser被吸,或被无限绞死。应该是什么原因?

没有showClock()只有showTime().. Typo Mistake

10 个答案:

答案 0 :(得分:3)

为此使用setInterval。重复正好是一个区间(而不是超时)。

示例:

//an edited showTime function for example
var showTime = function(){
    var now = new Date();
    document.getElementById('foobar').innerHTML = 
      now.toDateString()+" "+now.toTimeString();

};

//The interval
var myInterval = window.setInterval(showTime, 500);

此外:当您完成并希望停止间隔时,请使用

window.clearInterval(myInterval);

注意每Pointy和Mozilla文档setInterval可能会有问题。

在“危险用法”部分中了解更多信息: https://developer.mozilla.org/en/window.setInterval

编辑:您的代码在您未发布的某个功能中出现错误,导致您的挂断。我已经编辑了我的示例代码,只是为了演示使用间隔更新时间而没有任何特定格式,您可以在以下位置看到:http://jsfiddle.net/JVb2K/

答案 1 :(得分:1)

这里有一个递归循环。您的showTime函数调用自身,调用自身,调用自身。等

您需要重新排序代码。

答案 2 :(得分:1)

这应该有效:

function showTime() {    
    var now = new Date(),
        foo = document.getElementById('foobar');

    if ( foo != null ) {
        foo.innerHTML = now.getDate() + ' ' + strMonth( now.getMonth() ) + 
                ' ' + now.getFullYear() + ' / ' + 
                timeFormat( now.getHours(), now.getMinutes() ); 
        setTimeout(showTime, 500);
    }
}

showTime();

因此,只有页面上有foobar元素时,才设置其内容并执行超时。

答案 3 :(得分:0)

可能是因为你太早使用setTimeout。把它放在函数的末尾......

答案 4 :(得分:0)

我的猜测是因为你正在注册超时,每500ms调用一次方法,重新注册方法。换句话说,你每500ms递归调用一次方法。

您的方法可能会或可能不会在500毫秒内执行,因此除了不断执行代码之外,浏览器实际上什么都不做(这看起来很像挂起)。

我至少会将setTimeout()调用移到showTime()方法的末尾,并将超时时间增加到1000毫秒或2000毫秒(因为你只是显示时间到目前为止,它只是也可能高得多。)

答案 5 :(得分:0)

您正在调用showTime(),然后导致500毫秒的延迟并再次调用showTime(),这会导致500毫秒的延迟并再次调用showTime()等。因为它一直反复调用它而没有结束条件,所以它永远不会离开那个循环并执行函数中的其余代码。

答案 6 :(得分:0)

你的函数showtime()通过settimeout()调用自身并进行无限循环。 ;-)尝试将settimeout调用放在不同的函数中。

答案 7 :(得分:0)

我在您的代码中看到的主要问题是您将setTimeout置于错误的位置。当你调用你的函数时应该调用它。我能够在这个jsFiddle中获得这个代码的准系统实现,但这里是代码:

function showTime() {
    var now = new Date();
    var f_date = now.getDate() + " " + now.getMonth() + " " + now.getFullYear() + " / " + now.getHours() + ":" + now.getMinutes();
    document.getElementById('foobar').innerHTML = f_date;
}

setTimeout("showTime()",1000);

这将在1秒后更新foobar元素。再次,请参阅jsFiddle

答案 8 :(得分:0)

function showTime()
{
    setTimeout("showTime()", 500);      
    var now = new Date();
    var f_date = now.getDate()+" "+strMonth(now.getMonth())+" "+now.getFullYear()+" / "+timeFormat(now.getHours(), now.getMinutes());
    if (document.getElementById('foobar') == null)
    {
        showTime();

我不知道这是做什么的,但是如果你的文档中没有'foobar'元素,这将会递归调用自己,直到JavaScript引擎耗尽堆栈空间。但是到了这个时候你将创建大量的超时,每个超时都会递归调用自己,创建更多的超时等等......

答案 9 :(得分:0)

这是一个非常古老的话题,但对于那些仍在搜索中的人来说,我被困在同一个地方2周,我和Ajax进行了交流。我仍然是一个菜鸟,但看看Ajax Chat 3.1(1号房间)

http://webscripts.softpedia.com/script/Chat-Scripts/Most-Simple-Ajax-Chat-Room-39054.html

这是您可以编辑和实施的聊天示例。它没有挂起,它对我来说非常好。我希望这有效!