2010-09-18 38 views
5

一种不占用资源的方法,只需停止执行1秒钟然后执行?JavaScript有没有安全延迟?

我想要做的是动态地将Google量表从一个值移动到另一个值,从而创建移动到该值的效果而不是跳转到该值。

即 -

for(original_value; original_value < new_value; original_value++) 
{ 
    data.setValue(0, 1, original_value); 
    delay half a second here in JavaScript? 
} 

这是这样的一个OK的方式或者是更接近于什么演示做得非常好? :
How to: Dynamically move Google Gauge?

回答

5

否。网页浏览器中的JavaScript不仅是单线程的,而且它与浏览器呈现共享相同的线程。如果您的JavaScript代码被阻止,那么在此期间浏览器UI将变得无响应。

在JavaScript中处理基于时间事件的典型方法是使用asynchronous timersJohn Resig前一段时间写了一篇郁闷的文章,名字叫“How JavaScript Timers Work”,你可能想查看一下。


UPDATE:

您是否使用了Google Visualization API的轨距?如果是这样,我认为Google已经处理了您正在尝试实现的流畅动画。请在Google Code Playground(请注意网络仪表)中尝试以下操作:

function drawVisualization() { 
    // Create and populate the data table. 
    var data = new google.visualization.DataTable(); 
    var chart; 

    data.addColumn('string', 'Label'); 
    data.addColumn('number', 'Value'); 
    data.addRows(3); 
    data.setValue(0, 0, 'Memory'); 
    data.setValue(0, 1, 80); 
    data.setValue(1, 0, 'CPU'); 
    data.setValue(1, 1, 55); 
    data.setValue(2, 0, 'Network'); 
    data.setValue(2, 1, 68); 

    // Change the value of the Network Gauge after 3 seconds. 
    setTimeout(function() { data.setValue(2, 1, 20); chart.draw(data); }, 3000); 

    // Create and draw the visualization. 
    chart = new google.visualization.Gauge(document.getElementById('visualization')); 
    chart.draw(data); 
} 
+1

@Daniel Vassallo:setTimeOut()(唯一)的方式去(没有jQuery)? – 2010-09-18 00:54:54

+1

是的,'setTimeout'不会阻塞UI线程。 – 2010-09-18 00:55:31

+2

@Greg:是的,[setTimeout()](https://developer.mozilla.org/en/window.setTimeout)和[setInterval()](https://developer.mozilla.org/en/window.setInterval )不要阻止执行。他们会让你定义一个回调函数,当超时到期时会调用它。一般来说,这是JavaScript中大部分基于时间的事件的方法。 – 2010-09-18 00:58:41

4

这应该起作用。

var id, value = original_value; 
id = setInterval(function() { 
    if (value < new_value) { 
     data.setValue(0, 1, value++); 
    } else { 
     clearInterval(id); 
    } 
}, 1000); 
+0

不错,很好的例子,谢谢。 – 2010-09-18 01:04:46