当遇到句点或逗号时,如何减慢从数组中键入随机字符串的函数?
How to slow a function that types a random string from an array when it comes across a period or comma?
我有这样的打字机功能:
var myArray = [
'sentence. another sentence.',
'this sentence. yet another sentence.',
];
var rand = myArray[Math.floor(Math.random() * myArray.length)];
var i = 0;
var speed = 55;
function typeWriter() {
if (i < rand.length) {
document.getElementById("question").innerHTML += rand.charAt(i);
i++;
setTimeout(typeWriter, speed);
}
}
typeWriter();
<div id="question"></div>
如果当前输入的字符是句号或逗号,我如何才能将打字机功能速度更改为 80 毫秒,然后在输入普通字母时 return 变为 55 毫秒?这将帮助我用打字功能模仿说话的节奏并提高可读性。感谢您的帮助。
只需将 speed
或第二个参数更改为 setTimeout
。
当你这样做的时候,你也可以通过以下方式使代码更清晰:
1) 使用 await
而不是 setTimeout
,
2) 命名您的延迟(例如 DELAYS
),而不是一堆内联常量
3) 使用适当的 for 循环而不是用 if 语句重新发明 for 循环
4) 使用适当的局部变量和函数参数而不是全局变量。
5) 使用Element.textContent
代替innerHTML
6) 除非必要,否则在 JS 中使用单引号。
let el = document.querySelector('div');
let wait = delay => new Promise(r => setTimeout(r, delay));
let typeWriter = async sentence => {
const DELAYS = {'.': 500, ',': 200, default: 55};
for (let c of sentence) {
el.textContent += c;
await wait(DELAYS[c] || DELAYS.default);
}
};
typeWriter('sentence. a comma, another sentence. this sentence. yet another sentence.');
<div></div>
只需检查typeWriter
中的当前字符,并相应地设置下一个字符的超时时间。
要实现这一点,可以使用 conditional (ternary) operator (? :
):
var myArray = ['sentence. another sentence.',
'this sentence. yet another sentence.',
];
var rand = myArray[Math.floor(Math.random() * myArray.length)];
var i = 0;
function typeWriter() {
if (i < rand.length) {
document.getElementById("question").innerHTML += rand.charAt(i);
setTimeout(typeWriter, ['.', ','].includes(rand.charAt(i)) ? 80 : 55);
i++
}
}
您已经有一个名为 speed
的变量,那么当当前字符是逗号或句点时,为什么不更改它的值呢? (别忘了稍后再改回来!)。
var myArray = ['sentence. another sentence.',
'this sentence. yet another sentence.',
];
var rand = myArray[Math.floor(Math.random() * myArray.length)];
var i = 0;
var speed = 55;
function typeWriter() {
if (i < rand.length) {
document.getElementById("question").innerHTML += rand.charAt(i);
if(rand.charAt(i) == '.' || rand.charAt(i) == ',') {
speed = 1000;
}
else {
speed = 85;
}
i++;
setTimeout(typeWriter, speed);
}
}
typeWriter();
<p id="question"></p>
我就是这样做的(使其更加模块化,也是 ES6 风格)
const typeWriter = (str, writeTo, charDelays) => {
if (!str) return; // Empty
const nextChar = str.charAt(0);
writeTo.textContent += nextChar;
setTimeout(
() => typeWriter(str.slice(1), writeTo, charDelays), // typeWriter rest of the string
charDelays[nextChar] || charDelays.DEFAULT || 55 // Custom delay per character
);
}
那么你可以这样做:
typeWriter('my, very awesome, string!?', document.getElementById('question'), {
'!': 80,
',': 80
});
我有这样的打字机功能:
var myArray = [
'sentence. another sentence.',
'this sentence. yet another sentence.',
];
var rand = myArray[Math.floor(Math.random() * myArray.length)];
var i = 0;
var speed = 55;
function typeWriter() {
if (i < rand.length) {
document.getElementById("question").innerHTML += rand.charAt(i);
i++;
setTimeout(typeWriter, speed);
}
}
typeWriter();
<div id="question"></div>
如果当前输入的字符是句号或逗号,我如何才能将打字机功能速度更改为 80 毫秒,然后在输入普通字母时 return 变为 55 毫秒?这将帮助我用打字功能模仿说话的节奏并提高可读性。感谢您的帮助。
只需将 speed
或第二个参数更改为 setTimeout
。
当你这样做的时候,你也可以通过以下方式使代码更清晰:
1) 使用 await
而不是 setTimeout
,
2) 命名您的延迟(例如 DELAYS
),而不是一堆内联常量
3) 使用适当的 for 循环而不是用 if 语句重新发明 for 循环
4) 使用适当的局部变量和函数参数而不是全局变量。
5) 使用Element.textContent
代替innerHTML
6) 除非必要,否则在 JS 中使用单引号。
let el = document.querySelector('div');
let wait = delay => new Promise(r => setTimeout(r, delay));
let typeWriter = async sentence => {
const DELAYS = {'.': 500, ',': 200, default: 55};
for (let c of sentence) {
el.textContent += c;
await wait(DELAYS[c] || DELAYS.default);
}
};
typeWriter('sentence. a comma, another sentence. this sentence. yet another sentence.');
<div></div>
只需检查typeWriter
中的当前字符,并相应地设置下一个字符的超时时间。
要实现这一点,可以使用 conditional (ternary) operator (? :
):
var myArray = ['sentence. another sentence.',
'this sentence. yet another sentence.',
];
var rand = myArray[Math.floor(Math.random() * myArray.length)];
var i = 0;
function typeWriter() {
if (i < rand.length) {
document.getElementById("question").innerHTML += rand.charAt(i);
setTimeout(typeWriter, ['.', ','].includes(rand.charAt(i)) ? 80 : 55);
i++
}
}
您已经有一个名为 speed
的变量,那么当当前字符是逗号或句点时,为什么不更改它的值呢? (别忘了稍后再改回来!)。
var myArray = ['sentence. another sentence.',
'this sentence. yet another sentence.',
];
var rand = myArray[Math.floor(Math.random() * myArray.length)];
var i = 0;
var speed = 55;
function typeWriter() {
if (i < rand.length) {
document.getElementById("question").innerHTML += rand.charAt(i);
if(rand.charAt(i) == '.' || rand.charAt(i) == ',') {
speed = 1000;
}
else {
speed = 85;
}
i++;
setTimeout(typeWriter, speed);
}
}
typeWriter();
<p id="question"></p>
我就是这样做的(使其更加模块化,也是 ES6 风格)
const typeWriter = (str, writeTo, charDelays) => {
if (!str) return; // Empty
const nextChar = str.charAt(0);
writeTo.textContent += nextChar;
setTimeout(
() => typeWriter(str.slice(1), writeTo, charDelays), // typeWriter rest of the string
charDelays[nextChar] || charDelays.DEFAULT || 55 // Custom delay per character
);
}
那么你可以这样做:
typeWriter('my, very awesome, string!?', document.getElementById('question'), {
'!': 80,
',': 80
});