Javascript setTimeout函数挂起我的浏览器?
我使用java脚本显示时间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
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的问题