JavaScript中如何实现高亮搜索关键词?

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《JavaScript中如何实现高亮搜索关键词?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript中如何实现高亮搜索关键词?》有用,将其分享出去将是对创作者最好的鼓励。

在前端开发中,搜索关键词高亮是提升用户体验的常用功能,比如用户在页面内搜索内容时,匹配到的关键词需要以特殊颜色或背景显示。下面我们就一步步讲解如何用JavaScript实现这个功能。

JavaScript中如何实现高亮搜索关键词?

实现核心思路

高亮搜索关键词的核心逻辑可以分为三步:

  • 对搜索关键词进行转义,避免正则特殊字符导致匹配错误
  • 用转义后的关键词生成正则表达式,匹配目标文本中的对应内容
  • 将匹配到的关键词用带有高亮样式的标签包裹,替换原有文本

基础实现步骤

1. 转义关键词特殊字符

正则中有很多特殊字符,比如.*+?^${}()|[]\,如果关键词包含这些字符,直接用来生成正则会报错或者匹配不符合预期,所以需要先转义这些字符。

// 转义正则特殊字符
function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

2. 生成正则并替换文本

转义后的关键词可以用来生成全局匹配的正则,然后用<span class="highlight">标签包裹匹配到的内容,同时给高亮样式添加对应的CSS。

// 高亮文本中的关键词
function highlightKeyword(text, keyword) {
  if (!keyword) return text;
  // 转义关键词
  const escapedKeyword = escapeRegExp(keyword);
  // 生成全局不区分大小写的正则
  const reg = new RegExp(escapedKeyword, 'gi');
  // 替换匹配到的内容,用span包裹
  return text.replace(reg, '<span class="highlight">$&</span>');
}

3. 添加高亮样式

需要给包裹关键词的span标签添加样式,让高亮效果生效。

.highlight {
  background-color: #ffeb3b;
  color: #333;
  padding: 0 2px;
  border-radius: 2px;
}

处理DOM元素中的高亮

如果要对页面中某个DOM元素的内容做高亮,不能直接替换元素的innerHTML,否则会破坏原有的事件绑定和嵌套结构,正确的做法是遍历元素的文本节点,只替换文本节点的内容。

// 对DOM元素内容高亮关键词
function highlightElement(el, keyword) {
  if (!keyword) return;
  const escapedKeyword = escapeRegExp(keyword);
  const reg = new RegExp(escapedKeyword, 'gi');
  // 遍历所有子节点
  const childNodes = el.childNodes;
  for (let i = 0; i < childNodes.length; i++) {
    const node = childNodes[i];
    // 只处理文本节点
    if (node.nodeType === Node.TEXT_NODE) {
      const text = node.textContent;
      if (reg.test(text)) {
        // 重置正则的lastIndex,避免全局匹配失效
        reg.lastIndex = 0;
        const newHtml = text.replace(reg, '<span class="highlight">$&</span>');
        // 创建临时元素存放替换后的内容
        const tempEl = document.createElement('span');
        tempEl.innerHTML = newHtml;
        // 替换原文本节点
        el.replaceChild(tempEl, node);
      }
    } else if (node.nodeType === Node.ELEMENT_NODE) {
      // 递归处理子元素
      highlightElement(node, keyword);
    }
  }
}

完整使用示例

下面是一个简单的页面示例,输入关键词后点击按钮,就可以高亮页面中指定区域的内容。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>关键词高亮示例</title>
  <style>
    .highlight {
      background-color: #ffeb3b;
      color: #333;
      padding: 0 2px;
      border-radius: 2px;
    }
    .content {
      margin: 20px 0;
      line-height: 1.6;
    }
  </style>
</head>
<body>
  <input type="text" id="keywordInput" placeholder="输入搜索关键词">
  <button onclick="doHighlight()">高亮关键词</button>
  <div class="content" id="targetContent">
    JavaScript是一种轻量级的解释型编程语言,主要用于网页交互开发,也可以用于服务端开发、桌面应用开发等场景。学习JavaScript需要掌握变量、函数、DOM操作等基础内容。
  </div>

  <script>
    function escapeRegExp(str) {
      return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }

    function highlightElement(el, keyword) {
      if (!keyword) return;
      const escapedKeyword = escapeRegExp(keyword);
      const reg = new RegExp(escapedKeyword, 'gi');
      const childNodes = el.childNodes;
      for (let i = 0; i < childNodes.length; i++) {
        const node = childNodes[i];
        if (node.nodeType === Node.TEXT_NODE) {
          const text = node.textContent;
          if (reg.test(text)) {
            reg.lastIndex = 0;
            const newHtml = text.replace(reg, '<span class="highlight">$&</span>');
            const tempEl = document.createElement('span');
            tempEl.innerHTML = newHtml;
            el.replaceChild(tempEl, node);
          }
        } else if (node.nodeType === Node.ELEMENT_NODE) {
          highlightElement(node, keyword);
        }
      }
    }

    function doHighlight() {
      const keyword = document.getElementById('keywordInput').value.trim();
      const target = document.getElementById('targetContent');
      // 先清除之前的高亮,恢复原始内容
      target.innerHTML = target.textContent;
      if (keyword) {
        highlightElement(target, keyword);
      }
    }
  </script>
</body>
</html>

注意事项

  • 每次高亮前最好先清除之前的高亮效果,避免重复包裹标签导致样式异常
  • 如果关键词可能包含HTML特殊字符,除了正则转义,还要注意替换时的字符转义,避免XSS风险
  • 如果内容量很大,频繁操作DOM可能会影响性能,可以结合虚拟列表或者节流处理优化

JavaScript高亮搜索关键词正则匹配字符串替换DOM操作修改时间:2026-05-29 03:34:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。