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

JavaScript实现的打字动画执行时自动移除HTML标签该如何解决?

解决方案

问题根源

原有代码直接操作textContent属性,该属性会自动剥离元素内的所有HTML标签,仅保留纯文本内容,嵌套的标签及其样式会被直接丢弃。如果你传入的是元素的innerHTML作为打印内容,还会把标签本身的字符(比如<span、class=这类代码字符)计入打印队列,额外占用大量打印时间,就会出现卡顿后丢失样式的现象。

实现思路

要保留原有HTML结构,我们不需要修改任何元素节点的属性和结构,只需要递归提取目标元素下的所有文本节点,把每个文本节点的原有内容清空,再将所有待打印的字符和其所属的文本节点绑定成队列,按顺序逐个追加字符即可。

完整实现代码

function typeText(element) {
  // 存储待打印字符与所属文本节点的映射队列
  const charQueue = [];

  // 递归遍历所有节点提取文本内容
  function traverseNodes(node) {
    // 处理文本节点
    if (node.nodeType === Node.TEXT_NODE) {
      const originText = node.textContent;
      // 先清空文本节点原有内容
      node.textContent = '';
      // 逐个字符加入队列,绑定所属节点
      for (const char of originText) {
        charQueue.push({
          targetNode: node,
          character: char
        });
      }
      return;
    }
    // 元素节点递归处理所有子节点
    for (const child of node.childNodes) {
      traverseNodes(child);
    }
  }

  // 初始化提取所有字符
  traverseNodes(element);
  let currentIndex = 0;

  // 打字执行逻辑
  function runTyping() {
    if (currentIndex < charQueue.length) {
      const { targetNode, character } = charQueue[currentIndex];
      targetNode.textContent += character;
      currentIndex++;
      // 保留原有的随机打字速度逻辑
      const typingSpeed = Math.floor(Math.random() * 100) + 30;
      setTimeout(runTyping, typingSpeed);
    }
  }

  runTyping();
}

使用示例

针对你给出的嵌套span的h2结构,直接调用函数传入目标元素即可:

// 选中目标元素
const titleElement = document.querySelector('h2');
// 启动打字效果
typeText(titleElement);

该实现可以兼容任意层级的嵌套HTML标签,所有标签的原有样式、属性都会完全保留,不会出现卡顿或样式丢失的问题。

内容的提问来源于stack exchange,提问作者Nicolas Kuhn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:36:03