2013-10-27 77 views
0

我試圖讓jquery函數在列表中通過遞增/遞減來在不同的數字在相同的時間範圍在需要的地方。這就是我有一個列表:jQuery函數來連續運行,接近列表中的數字

// (initialised outside the function scope) 
var numbers = [10, 5, 13, 1, 1000]; 
var curNumber = 0; 
var i = 0; 

該函數應採取相同數量的時間(例如1秒),因爲它從curNumber = 0 to number[4] = 1000會從curNumber = 0 to number[0] = 10達到。在上面的列表中,代碼將在1秒內完成每個循環,從0到10到5到13到1到1000(如果最初爲curNumber = 0,總共5秒)。

什麼我的目標是一個簡單的函數來連續運行,如:

while(true) { 
    if (curNumber < numbers[i]) 
     curNumber++; 
    else if (curNumber > numbers[i]) 
     curNumber--; 

    if (curNumber == numbers[i]) { 
     alert(numbers[i] + " number reached!"); 
     i > numbers.length ? i = 0 : i ++; 
    } 
} 

計時器按鈕看起來像這樣:

$("#start").click(function() { 
    myTimerFunction(); 
}); 

我應該利用VAR refreshId的= setInterval(function(){},1000);功能? - 或者它只是每1000毫秒運行一次函數,這與數字接近的速度無關。

回答

1

我並不完全確定「更改費率」是什麼意思,但如果執行期間調用之間的延遲會發生變化(即過程應該加速或減速),那麼我會使用setTimeout()讓功能排隊本身的下一次調用,用一個變量以指定的延遲:如果間隔保持不變,然後setInterval()是OK

var delay = 1000; 
function myTimerFunction() { 
    // do something 
    // ... 
    if (someCondition) { 
     // change delay somehow 
    } 
    setTimeout(myTimerFunction, delay); 
} 

,但我個人更喜歡使用setTimeout()無論哪種方式,因爲我通常覺得有這樣的代碼更簡單:

if (someCondition) 
     setTimeout(myTimerFunction, delay); 

...決定是否保留「循環」而不是保存間隔ID,然後再調用clearInterval(),然後再次調用setInterval()

+0

更改比率,而不是像動態一樣,只是靜態地,該函數始終以相同的比率運行,但在將來的時間我可能希望它以1/2秒的速度運行,等等。 –

0

使用持有者變量refreshId這樣應該沒問題。要改變定時器,你只希望有這樣的事情:

var numberStep = function() { 
    if (curNumber < number[i]) 
    curNumber++; 
    else if (curNumber > number[i]) 
    curNumber--; 

    if (curNumber == number[i]){ 
    alert(number[i] + " number reached!"); 
    i++; //(or if i > numbers.length change to 0) 
    } 
}; 

var myTimerFunction (interval, currentTimer) { 
    if (currentTimer) clearInterval(currentTimer); 
    return setInterval(numberStep, interval); 
}; 

var refreshId = myTimerFunction(startingInterval); 

然後,每當你想改變的時間間隔,你可以只使用refreshId = myTimerFunction(newInterval, refreshId);。在您評論中給出的示例中,您將startingInterval設置爲1000,將newInterval設置爲500.