2014-12-13 102 views
-1

以下是我的javascript代码。我试图让我的函数timedisplay()每秒触发一次。 但它不是hapenning所以..无法在javascript中使用settimeout递归调用函数

function timedisplay() { 
 
    alert ("Welcome"); 
 
    var pelement = document.getElementById("myclock"); 
 
    var timeobj = new Date(); 
 
    alert (timeobj); 
 
    pelement.innerHTML = timeobj.toLocaleTimeString(); 
 
    alert (pelement.toLocaleTimeString()); 
 
    settimeout (timedisplay,1000); 
 
}
Timer Clock Testing.. 
 
<button onclick="timedisplay()">Click me</button> 
 
<p id="myclock"></p>

问题是什么?

+1

请注意,你有一个错字;它应该是“定时器时钟”。 – 2014-12-13 07:56:19

+0

我在体内试过,还是一样的问题。 – DrunkenMaster 2014-12-13 07:59:33

+1

您可能需要正确拼写'settimeout'。 – 2014-12-13 08:53:20

回答

2

P成分元素没有toLocaleTimeString()函数,它引用元素myclock 的setTimeout应该去的setTimeout

否则你的JavaScript是好的:

alert (pelement.toLocaleTimeString()); 

function timedisplay() 
 
{ 
 
//alert ("Welcome"); 
 
var pelement = document.getElementById("myclock"); 
 
var timeobj = new Date(); 
 
//alert (timeobj); 
 
pelement.innerHTML = timeobj.toLocaleTimeString(); 
 
//alert (pelement.toLocaleTimeString()); 
 
setTimeout (timedisplay,1000); 
 

 
}
Timer Cock Testing.. 
 
    <button onclick="timedisplay()">Click me</button> 
 
    <p id="myclock"> 
 
    </p>

+0

这对解释会更有帮助。 – 2014-12-13 07:55:08

+0

@EdCottrell解释是在路上 – 2014-12-13 07:58:48

+0

我试过了,但它在这个“运行代码片段”中起作用,但它在浏览器中不起作用。 :( – DrunkenMaster 2014-12-13 08:32:07

1

对于首先,它是setTimeout,而不是settimeout - 大写事宜。

二,不要做递归;几乎没有理由想要这样的递归超时。要重复此操作,请改用setInterval,并将其放入正文或其他功能中。

也就是说,如果您修复了setTimeout中的错字,您的代码看起来会好的。

+0

做,我们有任何缺点使用这种递归机制,而不是setInterval?。stack overflow问题类似 – DrunkenMaster 2014-12-13 08:37:06

+0

是的;在这个例子中遇到递归问题要容易得多,最好使用'setInterval',但只有在用户第一次点击按钮时才会这样做,否则,您最终可能会有多次递归(基于多次点击),导致糟糕的用户体验甚至崩溃。 – 2014-12-13 14:17:45

5

你可能会考虑调用setInterval函数而不是setTimeout,你只需要调用它一次。虽然技术上允许的setInterval在你的回调,这是更好的把它放在一个单独的功能,如下所示:

/* the callback */ 
function refreshTime() { 
    var pelement = document.getElementById("myclock"); 
    var timeobj = new Date(); 
    pelement.innerHTML = timeobj.toLocaleTimeString(); 
} 

/* start the clock */ 
function timedisplay() { 
    setInterval(refreshTime, 1000); 
}