2016-05-08 149 views
3

所以我已經制作了一個按字母打印出文字的函數,如下所示(我知道我的命名方案不好,請不要開玩笑。我還是相當新的編碼,所以我的代碼看起來有點奇怪/低效的。)Javascript setInterval每次運行時間越短

var text = document.getElementById("gametext") 
var dialog = "the entire text you want to print out" 
var talk = "The whole text gets added here, letter by letter" 
var charinc = 0 

function talky() { 
    setInterval(function(){ 
    if(charinc < dialog.length){ 
    talk = dialog.charAt(charinc++); 
    text.innerHTML += talk; 
    } 
    }, 100); 
    charinc = 0 
} 

,我調用這個函數多次在我的代碼,設置對話框,不管它是什麼,我想打印,和然後調用該函數。一開始它運行良好,但每次運行它時,看起來字母的打印速度越來越快。我不確定發生了什麼,或者如何解決它。我在谷歌上做過幾次搜索,但沒有任何用處。

+0

你爲什麼初始化'talk'當你剛剛要去從'charAt'分配結果呢? –

+1

每次調用'talky()'時,都會調用'setInterval()'並註冊一個函數,每100毫秒調用一次。你永遠不會使用'setInterval'來存儲句柄......並且從不在其上使用'clearInterval()'...因此,最終會有多個間隔函數運行,這會給間距週期減少_appearance_。 – canon

回答

6

第一次運行它時,每隔100ms就有一個間隔運行。

第二次運行它時,您有兩個間隔,每個間隔每100毫秒運行一次。

依此類推。

由於它們共享相同的變量,因此您只需使每個變量以每100ms一次寫入的速度增加輸出速度。


或者:

  • 電話clearInterval(...)當你完成
  • 傳遞全局變量作爲參數傳遞給talky所以他們沒有多間隔之間共享
  • 只需更新變量而不是再次呼叫talky
+0

好吧,我現在明白了這個問題,但我不太清楚我應該如何使用clearInterval。我應該每當我想運行talky時手動調用它?我應該把它插入通話內的某個地方嗎?對不起,如果我聽起來像一個白癡,但我仍然是一個新的編碼(似乎我很容易理解一些概念,而其他人,如間隔,就在我頭上) – twondai

+0

「當你完成」 ,即作爲'else'來表示if(charinc Quentin

3

setInterval會讓你定義的函數每隔100ms運行一次。如果你像你說的那樣多次調用這個函數,將會有幾個間隔並行運行,這可能不是你想要的。

您可以使用clearIntervalsetInterval返回的ID來清除現有時間間隔。

例如

var intervalId = setInterval(function() { console.log('hello, world!') }, 100); clearInterval(intervalId);

相關問題