3 回答

TA貢獻1828條經驗 獲得超4個贊
我不確定您是否可以更改setTimeinterval一次定義的時間。最好使用setTimeout. 我正在使用遞歸函數來實現所需的 -
function print(string, i){
var time = 50
if(string[i]==",") time = 1000
setTimeout(function(){
span.innerHTML += string[i]
if(i<string.length-1) print(string,++i)
},time)
}
完整的例子可以在這里找到

TA貢獻1880條經驗 獲得超4個贊
首先,我認為setInterval這不是你要找的。由于您似乎只想延遲打印每個字符,setTimeout因此在這種情況下效果最佳。
我會將其分解,以便您可以專注于一次打印一個字符,然后您可以在主print函數中為字符串中的每個字符調用它。
這就是我將使用 Promises 做這樣的事情的方式:
const printCharacter = (ch, idx) => new Promise(resolve => {
let time = 50 * idx;
if(ch === ',') {
time = 150 + time * idx;
}
setTimeout(() => {
const span = document.getElementById('text');
span.innerHTML += ch;
resolve();
}, time)
});
const print = async string => {
for(let i = 0; i < string.length; i++) {
await printCharacter(string[i], i);
}
};
這里可能會出現一些錯誤,例如基本字符串中存在多個逗號的時間。這只是我的第一次迭代。

TA貢獻1829條經驗 獲得超9個贊
我建議使用 for 循環來迭代字符串,并使用 Promise 來根據需要暫停,而不是使用間隔。
旁注,使用textContent代替innerHTML。前者像myCar.cangeTires(); myCar.closeDoors(),后者像myCar.do('change tires'); myCar.do('close doors');。
let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
var span = document.getElementById('text');
let print = async string => {
span.textContent = '';
for (let c of string) {
span.textContent += c;
await sleep(c === ',' ? 500 : 50);
}
};
print('my text, and a comma');
<span id="text"></span>
添加回答
舉報