You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS实现打字机效果时typeWriter函数传参报错问题排查

可动态传参的打字机效果实现方案

核心报错原因

  • setTimeout(typeWriter, speed) 调用时未传入函数依赖的text、speed形参,定时器触发执行typeWriter时,两个参数值均为undefined,访问text.length直接抛出类型错误。
  • 原有for循环批量创建定时器的逻辑存在时序问题:循环会在主线程瞬间执行完成,所有注册的定时器几乎同时触发,无法实现逐字间隔输出的效果,切换文本时还会出现多打字任务叠加冲突的问题。

修复后可直接复用的代码

HTML部分(确认已有元素)

<p id="demo"></p>
<button id="switchBtn">切换输出文本</button>

JS部分

// 存储定时器ID,用于切换文本时中断上一个打字任务
let typingTask = null;
const targetEl = document.getElementById("demo");

/**
 * 可动态传参的打字机函数
 * @param {string} text 待逐字输出的目标文本
 * @param {number} speed 单字输出间隔,单位毫秒
 */
function typeWriter(text, speed) {
  // 启动新任务前先清空内容、终止未完成的旧打字任务
  clearTimeout(typingTask);
  targetEl.innerHTML = "";
  let currentIndex = 0;

  // 内部递归实现逐字输出,替代原有的for循环逻辑
  function printChar() {
    if (currentIndex < text.length) {
      targetEl.innerHTML += text.charAt(currentIndex);
      currentIndex++;
      typingTask = setTimeout(printChar, speed);
    }
  }

  printChar();
}

// 页面加载完成自动输出第一段文本
window.addEventListener("DOMContentLoaded", () => {
  typeWriter("Lorem impsum", 50);
})

// 按钮点击清空原有内容,输出第二段文本
document.getElementById("switchBtn").addEventListener("click", () => {
  // 此处替换为你需要的text2内容即可
  typeWriter("这是点击按钮后要输出的第二段文本", 50);
})

实现说明

  • 采用内部递归的方式触发下一个字的输出,每次输出完当前字才注册下一次的定时器,能精准控制逐字输出的间隔。
  • 每次调用typeWriter时都会先终止之前未完成的打字任务、清空容器内容,不会出现多段文本叠加输出的问题。
  • 函数支持任意传入目标文本和输出速度,不需要硬编码固定文本,完全满足页面加载、按钮点击两种场景下输出不同文本的需求。

内容的提问来源于stack exchange,提问作者82.pb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:57:20