如何使用 JavaScript 高亮显示搜索字符串结果?


在 Web 应用程序中,在一个大型文本内容中搜索特定内容是很常见的任务。然而,仅仅显示搜索结果而没有任何视觉指示,可能会使用户难以识别和关注相关信息。这就是需要高亮显示搜索字符串的原因。通过动态高亮显示文本中匹配的部分,我们可以改善用户体验,并使用户更容易找到所需内容。

在这篇博文中,我们将探讨使用 JavaScript 高亮显示搜索字符串的不同方法。我们将介绍各种技术,从操作 HTML 内容到利用正则表达式和 CSS 样式。无论您是为网站构建搜索功能,还是正在处理基于文本的应用程序,这些方法都将使您能够增强搜索结果的可见性,并提供更直观的用户界面。

方法一 - 操作内部 HTML

一种直接高亮显示搜索字符串的方法是操作包含文本的元素的内部 HTML。此方法包括查找文本中搜索字符串的出现位置,并用 HTML 标签将其括起来或应用内联样式以视觉上突出显示它们。

要实现此方法,请按照以下步骤操作:

  • 检索执行搜索的目标元素的内容。

  • 使用 replace() 方法或正则表达式查找并替换用高亮显示版本替换搜索字符串。

  • 用 HTML 标签包装匹配的字符串或应用内联样式来突出显示它。

  • 将修改后的内容设置回目标元素的内部 HTML。

让我们用一个例子来说明这一点。假设我们有一个类名为“content”的 HTML 元素,并且我们想突出显示其中搜索字符串的出现位置。我们可以使用以下 JavaScript 代码:

// Get the target element
const contentElement = document.querySelector('.content');

// Retrieve the content
const content = contentElement.innerHTML;

// Replace the search string with the highlighted version
const highlightedContent = content.replace(/search-string/gi, '$&');

// Set the modified content back to the element
contentElement.innerHTML = highlightedContent;

在上面的代码中,我们使用带正则表达式的 replace() 方法查找并替换所有用高亮显示版本替换搜索字符串的出现位置。替换字符串中的$&代表匹配的字符串本身。我们用一个元素将其包装起来,并应用“highlight”类进行样式设置。

示例

示例如下:

<!DOCTYPE html>
<html>
<head>
   <style>
      .highlight {
         background-color: yellow;
         font-weight: bold;
      }
   </style>
</head>
<body>
   <div class="content">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
      Aliquam cursus maximus eros, non consequat nulla vulputate id. 
      Sed porttitor quam a felis viverra lacinia. 
      Vestibulum vestibulum massa at orci ultrices, in maximus tellus aliquam.
   </div>
   <form>
      <input type="text" id="searchInput" placeholder="Search...">
      <button type="button" onclick="highlightText()">Search</button>
   </form>
   <script>
      function highlightText() {
         const searchInput = document.getElementById('searchInput');
         const searchValue = searchInput.value.trim();
         const contentElement = document.querySelector('.content');
   
         if (searchValue !== '') {
         const content = contentElement.innerHTML;
         const highlightedContent = content.replace(
            new RegExp(searchValue, 'gi'),
            '<span class="highlight">$&</span>'
         );
         contentElement.innerHTML = highlightedContent;
         } else {
            contentElement.innerHTML = contentElement.textContent;
         }
      }
   </script>
</body>
</html>

在这个例子中,我们有一个包含一些示例文本的 content div 的 HTML 文档。我们还有一个输入字段供用户输入他们的搜索字符串和一个搜索按钮。当用户点击搜索按钮时,会触发 highlightText() 函数。

在 highlightText() 函数内部,我们从输入字段检索搜索字符串,并修剪任何前导或尾随空格。如果搜索字符串不为空,我们使用其内部 HTML 检索 contentElement 的内容。然后,我们使用 replace() 方法和正则表达式将所有搜索字符串的出现位置(不区分大小写)替换为高亮显示的版本。匹配的字符串 ($&) 包含在带有“highlight”类的元素中。

如果搜索字符串为空,我们将通过将内部 HTML 设置为 contentElement 的文本内容来恢复原始内容。

方法二:使用 CSS 类进行高亮显示

在此方法中,我们将使用 CSS 类来高亮显示搜索字符串,而不是操作内部 HTML。以下是操作方法。

示例

<!DOCTYPE html>
<html>
<head>
   <style>
      .highlight {
         background-color: yellow;
         font-weight: bold;
      }
   </style>
</head>
<body>
   <div class="content">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
      Aliquam cursus maximus eros, non consequat nulla vulputate id. 
      Sed porttitor quam a felis viverra lacinia. 
      Vestibulum vestibulum massa at orci ultrices, in maximus tellus aliquam.
   </div>

   <form>
      <input type="text" id="searchInput" placeholder="Search...">
      <button type="button" onclick="highlightText()">Search</button>
   </form>

   <script>
      function highlightText() {
         const searchInput = document.getElementById('searchInput');
         const searchValue = searchInput.value.trim();
         const contentElement = document.querySelector('.content');
   
         if (searchValue !== '') {
            const content = contentElement.textContent;
            const regex = new RegExp(searchValue, 'gi');
            const highlightedContent = content.replace(
               regex,
               (match) => `<span class="highlight">${match}</span>`
            );
            contentElement.innerHTML = highlightedContent;
          } else {
             contentElement.innerHTML = contentElement.textContent;
          }
       }
   </script>
</body>
</html>

在这个例子中,我们定义了一个名为“highlight”的 CSS 类,它应用于高亮显示文本的所需样式。在 highlightText() 函数内部,我们检索搜索字符串,对其进行修剪,并使用其文本内容检索 contentElement 的内容。然后,我们使用搜索字符串和标志 'gi'(全局和不区分大小写)创建一个正则表达式。

接下来,我们使用 content 字符串上的 replace() 方法将所有搜索字符串的出现位置替换为高亮显示的版本。我们不使用字符串替换,而是使用一个回调函数,该函数将匹配的字符串包装在一个带有“highlight”类的<span>元素中。

最后,我们将 contentElement 的内部 HTML 设置为高亮显示的内容。如果搜索字符串为空,我们将通过将内部 HTML 设置为文本内容来恢复原始内容。

方法三:使用正则表达式

在此方法中,我们将利用正则表达式的强大功能来动态高亮显示搜索字符串。正则表达式提供了一种灵活而强大的方法来匹配字符串中的模式。以下是我们可以使用正则表达式来高亮显示搜索字符串的方法

示例

<!DOCTYPE html>
<html>
<head>
   <style>
      .highlight {
         background-color: yellow;
         font-weight: bold;
      }
   </style>
</head>
<body>
   <div id="content">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
      Aliquam cursus maximus eros, non consequat nulla vulputate id. 
      Sed porttitor quam a felis viverra lacinia. 
      Vestibulum vestibulum massa at orci ultrices, in maximus tellus aliquam.
   </div>   
   <form>
      <input type="text" id="searchInput" placeholder="Search...">
      <button type="button" onclick="highlightText()">Search</button>
   </form>   
   <script>
      function highlightText() {
         const searchInput = document.getElementById('searchInput');
         const searchValue = searchInput.value.trim();
         const contentElement = document.getElementById('content');
   
         if (searchValue !== '') {
         const content = contentElement.innerHTML;
         const regex = new RegExp(`(${searchValue})`, 'gi');
         const highlightedContent = content.replace(
            regex,
            '<span class="highlight">$1</span>'
         );
         contentElement.innerHTML = highlightedContent;
         } else {
            contentElement.innerHTML = contentElement.textContent;
         }
      }
   </script>
</body>
</html>

在这个例子中,我们使用 RegExp 构造函数定义一个正则表达式,传递搜索值和标志 'gi'(全局和不区分大小写)。我们将搜索值放在括号中以将其捕获为一个组。

在 highlightText() 函数内部,我们检索搜索字符串,对其进行修剪,并使用其内部 HTML 检索 contentElement 的内容。然后,我们使用 content 字符串上的 replace() 方法,提供正则表达式和一个替换字符串,该字符串将匹配的搜索值包装在一个带有“highlight”类的元素中。

方法比较

现在,让我们比较我们已经介绍的方法:

方法一:操作内部 HTML

  • 性能 此方法对于小型到中型文本效率很高,但由于字符串操作,对于大型文本可能会变慢。

  • 易于实现 使用 JavaScript 的内置字符串函数相对容易实现。

  • 灵活性 它在自定义高亮显示样式和处理大小写方面提供了灵活性。

  • 浏览器兼容性 此方法在现代浏览器中得到广泛支持。

方法二:使用 CSS 类进行高亮显示

  • 性能 与其他方法相比,此方法可能较慢,尤其是在处理大型文本或频繁搜索操作时,因为 DOM 操作开销较大。

  • 易于实现 它需要很好地理解 DOM 操作,并且可能涉及更复杂的代码。

  • 灵活性 它在自定义高亮显示样式和处理大小写方面提供了灵活性。

  • 浏览器兼容性 此方法受现代浏览器支持,但在不同实现之间可能存在细微的差异。

方法三:使用正则表达式

  • 性能 正则表达式对于搜索和高亮显示文本非常高效,即使是大量数据也是如此。

  • 易于实现 实现正则表达式需要扎实地理解其语法,这对于初学者来说可能更具挑战性。

  • 灵活性 正则表达式提供了强大的模式匹配功能,允许进行高级搜索和高亮显示选项。

  • 浏览器兼容性 正则表达式在现代浏览器中得到广泛支持,但一些旧版本可能在正则表达式支持方面存在限制或差异。

结论

在本文中,我们探讨了使用 JavaScript 高亮显示搜索字符串的不同方法。每种方法都有其自身的优势和注意事项,因此必须根据性能、易于实现、灵活性以及浏览器兼容性等因素对其进行评估。

通过理解这些方法,您可以增强 Web 应用程序的搜索功能,并提供更直观的用户体验。

更新于:2023年8月7日

浏览量:3K+

开启你的职业生涯

完成课程获得认证

开始学习
广告