如何替换HTML中无内容标签
时间:2026-02-08 13:54:50 374浏览 收藏
哈喽!今天心血来潮给大家带来了《如何替换 HTML 中未包裹文本内容》,想必大家应该对文章都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习文章,千万别错过这篇文章~希望能帮助到你!
包裹的文本内容
" />
本文介绍如何遍历 DOM 中的纯文本节点(Text Nodes),仅对未被 `` 等标签包裹的原始文本中的目标字符串(如 `TARGET`)进行安全替换,并将其包装为带指定 class 的 ``,避免重复处理已标记的内容。
在实际前端开发中,常需对页面中特定关键词做高亮或语义化标记(例如添加 class="target-class"),但必须谨慎避开已被 HTML 标签包裹的内容——否则会导致嵌套错误、重复包装或破坏原有结构。核心难点在于:element.children 仅返回元素节点(Element Nodes),而忽略纯文本节点(Text Nodes);若直接操作 innerHTML,又极易污染已有 HTML 结构(如误改 contains TARGET 中的 TARGET)。
正确解法是使用 element.childNodes —— 它包含所有子节点类型(元素、文本、注释等),再通过 node.nodeType === Node.TEXT_NODE 精准筛选出纯文本片段。随后利用 document.createRange().createContextualFragment() 安全解析并替换文本中的匹配项,最后用 node.replaceWith(...) 原位更新。
以下为可直接运行的完整示例:
function replaceTargetInTextNodes(container: HTMLElement, target = 'TARGET', className = 'target-class') {
const reg = new RegExp(`\\b${target}\\b`, 'g'); // 使用 \b 确保单词边界匹配
for (const node of container.childNodes) {
if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {
const replacedHtml = node.textContent.replace(reg, `<span class="${className}">$&</span>`);
if (replacedHtml !== node.textContent) {
const fragment = document.createRange().createContextualFragment(replacedHtml);
node.replaceWith(fragment);
}
}
}
}
// 调用示例
const container = document.querySelector('#a') as HTMLElement;
replaceTargetInTextNodes(container);✅ 关键优势说明:
- ✅ 不干扰已有 HTML:只处理 TEXT_NODE,跳过 、等元素节点,天然规避对 contains TARGET 的误操作;
- ✅ 保留原始结构:使用 createContextualFragment 解析 HTML 片段,确保生成的 是合法 DOM 节点,而非字符串拼接;
- ✅ 精准匹配:正则中加入 \b 边界符,防止 TARGETED 或 INTARGET 被误匹配;
- ✅ 性能友好:仅遍历一级 childNodes,无需递归或深度 DOM 查询。
⚠️ 注意事项:
- 若容器内存在
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
157 收藏
-
203 收藏
-
265 收藏
-
493 收藏
-
320 收藏
-
215 收藏
-
303 收藏
-
283 收藏
-
158 收藏
-
374 收藏
-
253 收藏
-
253 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习