2010-09-18 84 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