Javascript setTimeout函数挂起我的浏览器?

Javascript setTimeout函数挂起我的浏览器?,javascript,jquery,datetime,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 (docum

我使用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();
我的
浏览器
被吸,或者被无限地绞死。原因应该是什么


没有showClock()只有showTime()。。输入错误

可能是因为您过早地使用了setTimeout。请尝试将其放在函数末尾…

这里有一个递归循环。showTime函数调用它自己,它调用它自己,它调用它自己。等等


您需要对代码重新排序。

我猜可能是因为您每500毫秒注册一次调用方法的超时,这会重新注册该方法。换句话说,每500毫秒递归调用一次方法

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


我至少会将
setTimeout()
调用移动到showTime()方法的末尾,并将超时增加到1000ms或2000ms左右(因为您只显示了一分钟的时间,所以也可能更高)。

为此使用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);
注意:per Pointy和Mozilla docs setInterval可能存在问题

请在“危险使用”部分了解更多信息:


编辑:您的代码似乎在您未发布的某个函数中有错误,这导致了您的挂断。我编辑了我的示例代码,只是为了演示在没有任何特定格式的情况下更新时间间隔的用法,您可以在这里看到:

您正在调用showTime(),这会导致500毫秒的延迟并再次调用showTime(),这会导致500毫秒的延迟并再次调用showTime(),等等。由于它在没有结束条件的情况下一次又一次地调用它,因此它永远不会退出该循环并执行函数中的其余代码。

您的函数showtime()通过settimeout()调用自己,并形成一个无限循环。;-)尝试将settimeout调用放在另一个函数中。

我看到您的代码存在的主要问题是将
settimeout
放在了错误的位置。它应该在调用函数时被调用。我能够在这种情况下获得此代码的基本实现,但代码如下:

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); 函数showTime(){ var now=新日期(); var f_date=now.getDate()+“”+now.getMonth()+“”+now.getFullYear()+“/”+now.getHours()+“:“+now.getMinutes(); document.getElementById('foobar').innerHTML=f_date; } setTimeout(“showTime()”,1000); 这将在1秒后更新
foobar
元素。同样,请参见。

这应该可以:

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元素时,才可以设置其内容并执行超时

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引擎耗尽堆栈空间。然而,此时您将创建大量的超时,每个超时都会递归调用自身,创建更多的超时等等。

这是一个非常古老的主题,但对于仍在搜索中的人来说。。我在同一个地方呆了两个星期,我使用了
Ajax
。在这方面我还是个新手,但看看ajaxchat3.1(房间1)


这是一个可以编辑和实现的聊天示例。它挂不住,对我来说效果很好。我希望这能奏效

浏览器是否报告了任何JavaScript错误?我想我们需要看看“showClock()”的作用。可能是strMonth或timeFormat导致了您的问题。你能展示一下这些函数的代码吗?很好,到目前为止,每一个答案都是错误的。看起来这几行代码不太可能需要500毫秒来执行……它实际上不是递归的;对“showTime()”的第一次调用将在第二次调用之前很久退出。@Pointy-没有任何迹象表明showTime()运行将退出。根据在那里调用的其他方法的性能,它可以轻松运行500毫秒以上。@Justin是的,这是真的,但这就是我要求查看“showClock()”的原因。也许“showClock()”正在调用“showTime()”。。。但是,那里的代码看起来肯定不像需要1/2秒才能运行的代码@Pointy-我也很想看看strMonth()和timeFormat()。@Pointy:谢谢,我见过很多人提到你不应该使用setInterval,但我从来没见过为什么。你让我查阅了mozilla文档,对此我很感激。你不需要函数包装器。刚好:
setInterval(showTime,500)@Šime Vidas谢谢,我有一个坏习惯,就是大量使用匿名函数包装,而且一直都是这样。将编辑代码以修复此问题。@我建议您定义一个专用函数,返回格式化的日期字符串,这样您就可以编写此函数:
foo.innerHTML=formattedDate(现在)您将使用此formattedDate函数,而不是strMonth和timeFormat函数。谢谢。你节省了我的时间:)但这不是OP的问题