setTimeout
не блокируется, а следующий write
выполняется сразу после того, как первый write
напечатал первый символ. Тогда i
будет сброшено на 0
, и только второй вызов write
будет выполнен правильно.
Это можно исправить с помощью обещаний или просто путем цепочки слов для ввода write
функция, как это:
var txt = '',
i = 0,
pad = document.getElementById('text'),
speed;
function typeWriter() {
if (i < txt.length) {
pad.insertAdjacentText('beforeEnd', txt.charAt(i));
i++;
setTimeout(typeWriter, speed);
}
}
function write(whatToWrite, howFast) {
txt += whatToWrite;
speed = howFast;
typeWriter();
}
write('hello', 100);
write(' world', 100);
html {
background-color: #0a1c08;
color: #ffffff;
font-size: 20px;
}
<p id="text"></p>
Обратите внимание, что txt
и i
теперь инициализируются в верхней области вместо функции write
. Я также определил элемент для ввода вне функции и использовал insertAdjacentText
вместо innerHTML
. Эти изменения делают код более легким для выполнения, особенно если вы собираетесь набирать очень длинный текст в абзаце.