javascript - 如何从列表中获取单词并以时间延迟逐字符显示它们

标签 javascript

我想模拟一个自动完成功能。一个句子应该用列表中的单词完成。这些单词应在句末逐字符显示。
这是 HTML:

<p>We can help you with<span id="complete"></span></p>
这是 JS 的一部分:
let words = ["design", "frontend", "backend"];
let output = document.getElementById("complete");
首先我尝试了这个:
words.forEach((e) => {
  for (i = 0; i < e.length; i++) {
    setTimeout(() => {
      console.log(e[i]);
    }, 500);
  }
});
控制台记录:
enter image description here
这是因为迭代器前进了之前 设置超时。
所以我尝试了一个这样的while循环:
words.forEach((e) => {
  let i = 0;
  while (i <= e.length) {
    setTimeout(() => {
      console.log(e[i]);
    }, 600);
    i++;
  }
});
我懂了:
enter image description here
我不知道如何逐个字符放置 - 以便它们加起来像:d;德;德;德西;设计;设计与每个字符之间的延迟。
(要在 DOM 中逐个字符地放置单词,我不会使用控制台日志,而是使用 complete.innerHTML += variableForWordinList[index for char])
谢谢

最佳答案

setTimeout是异步的。因此,当它执行该函数时,您正在记录的值已经发生了变化。
你想要实现的是一种打字机效果。可以使用 setInterval 的组合来实现和 setTimeout .

let words = ["design", "frontend", "backend"];
let output = document.getElementById("complete");

let idx = 0;
let str = "";

function typeWrite() {
  if (idx >= words.length) idx = 0;

  let word = words[idx];
  let charInd = 0;
  let interval = setInterval(() => {
    if (charInd >= word.length) {
      clearInterval(interval);
      setTimeout(() => {
        idx++;
        str = "";
        typeWrite();
      }, 1000);  // <- Wait for 1 sec before printing next word
    }
    str += word.charAt(charInd);
    output.innerHTML = str;
    charInd++;
  }, 100); // <- Delay between each character
}

typeWrite();
<p>We can help you with <span id="complete"></span></p>

关于javascript - 如何从列表中获取单词并以时间延迟逐字符显示它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70171989/

相关文章:

javascript - 从字符串中提取日期抛出错误

javascript - 在 jQuery UI 按钮标题上使用 ISO-8859-1

javascript - 如何使用 useState Hook 更新状态

javascript - 如果响应包含 50 个 id,如何使用递归进行连续的 axios 调用?

javascript - 如何模拟服务器?

javascript - 如何在 javascript 函数中使用 Razor 值?

javascript - 非常简单的 vue.js 组件生成超出最大调用堆栈大小

javascript - jQuery 序列化所选选项的值,而不是标签

javascript - React.js 和 ES6 : Any reason not to bind a function in the constructor

javascript - 在选择中替代 onblur/onchange