当前位置:首页 > JavaScript

js实现全局搜索

2026-03-16 01:30:27JavaScript

实现全局搜索的方法

在JavaScript中实现全局搜索功能,可以通过以下几种方式来完成。以下方法适用于前端实现,可以根据需求选择合适的方式。

使用DOM遍历实现搜索

通过遍历DOM元素,匹配关键词并高亮显示结果。这种方法适用于静态页面或简单的动态内容。

js实现全局搜索

function globalSearch(keyword) {
  const elements = document.querySelectorAll('body *');
  elements.forEach(element => {
    if (element.childNodes.length > 0) {
      element.childNodes.forEach(child => {
        if (child.nodeType === Node.TEXT_NODE && child.textContent.includes(keyword)) {
          const span = document.createElement('span');
          span.style.backgroundColor = 'yellow';
          span.textContent = child.textContent;
          child.replaceWith(span);
        }
      });
    }
  });
}

使用事件监听实现动态搜索

通过监听输入框的变化,实时触发搜索逻辑。这种方法适用于需要动态响应的场景。

const searchInput = document.getElementById('search-input');
searchInput.addEventListener('input', (e) => {
  const keyword = e.target.value.trim();
  if (keyword) {
    globalSearch(keyword);
  } else {
    clearHighlights();
  }
});

function clearHighlights() {
  const highlights = document.querySelectorAll('span[style="background-color: yellow;"]');
  highlights.forEach(highlight => {
    highlight.replaceWith(highlight.textContent);
  });
}

使用正则表达式增强搜索

通过正则表达式实现更灵活的匹配,例如不区分大小写或部分匹配。

js实现全局搜索

function globalSearchWithRegex(keyword) {
  const regex = new RegExp(keyword, 'gi');
  const elements = document.querySelectorAll('body *');
  elements.forEach(element => {
    if (element.childNodes.length > 0) {
      element.childNodes.forEach(child => {
        if (child.nodeType === Node.TEXT_NODE && regex.test(child.textContent)) {
          const span = document.createElement('span');
          span.style.backgroundColor = 'yellow';
          span.textContent = child.textContent.replace(regex, match => `<mark>${match}</mark>`);
          child.replaceWith(span);
        }
      });
    }
  });
}

结合后端API实现全局搜索

如果数据量较大或需要跨页面搜索,可以调用后端API获取搜索结果并动态渲染。

async function searchWithAPI(keyword) {
  const response = await fetch(`/api/search?q=${keyword}`);
  const results = await response.json();
  renderResults(results);
}

function renderResults(results) {
  const resultsContainer = document.getElementById('results');
  resultsContainer.innerHTML = '';
  results.forEach(result => {
    const div = document.createElement('div');
    div.textContent = result.title;
    resultsContainer.appendChild(div);
  });
}

使用第三方库实现高级搜索

对于复杂的搜索需求,可以使用第三方库如Lunr.js或Fuse.js,它们提供了全文搜索、模糊匹配等功能。

const fuse = new Fuse(data, {
  keys: ['title', 'content'],
  threshold: 0.4
});

function searchWithFuse(keyword) {
  const results = fuse.search(keyword);
  renderResults(results);
}

注意事项

  • 对于大型应用,建议使用虚拟滚动或分页加载搜索结果,避免性能问题。
  • 如果搜索内容涉及敏感数据,确保在后端处理搜索逻辑,避免前端暴露数据。
  • 高亮显示搜索结果时,注意不要破坏原有的DOM结构或事件绑定。

标签: 全局js
分享给朋友:

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

如何全局安装react

如何全局安装react

全局安装React的方法 全局安装React通常指的是安装React相关的命令行工具或脚手架,以便在任何项目中使用。以下是具体步骤: 安装create-react-app工具 create-rea…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…