当前位置:首页 > JavaScript

js实现联想输入

2026-03-01 06:18:43JavaScript

实现联想输入的基本思路

联想输入(即自动补全或搜索建议)的核心是通过监听用户输入,实时匹配数据并展示匹配结果。以下是一个基于JavaScript的实现方案:

监听输入事件

使用input事件监听用户输入,获取输入框的值:

const inputElement = document.getElementById('search-input');
inputElement.addEventListener('input', handleInput);

匹配数据逻辑

定义匹配函数,根据输入内容过滤数据源(假设数据源为数组):

function filterSuggestions(input, data) {
  return data.filter(item => 
    item.toLowerCase().includes(input.toLowerCase())
  );
}

展示匹配结果

创建DOM元素动态显示匹配结果:

function displaySuggestions(suggestions) {
  const container = document.getElementById('suggestions-container');
  container.innerHTML = '';

  suggestions.forEach(suggestion => {
    const div = document.createElement('div');
    div.textContent = suggestion;
    div.addEventListener('click', () => {
      document.getElementById('search-input').value = suggestion;
      container.innerHTML = '';
    });
    container.appendChild(div);
  });
}

防抖优化

为避免频繁触发搜索,需添加防抖函数:

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => func.apply(this, args), delay);
  };
}

const debouncedHandleInput = debounce(handleInput, 300);
inputElement.addEventListener('input', debouncedHandleInput);

完整示例代码

<input type="text" id="search-input" placeholder="输入搜索内容">
<div id="suggestions-container"></div>

<script>
  const data = ['苹果', '香蕉', '橙子', '西瓜', '芒果'];
  const inputElement = document.getElementById('search-input');

  function handleInput() {
    const input = inputElement.value.trim();
    const suggestions = filterSuggestions(input, data);
    displaySuggestions(suggestions);
  }

  function filterSuggestions(input, data) {
    return data.filter(item => 
      item.toLowerCase().includes(input.toLowerCase())
    );
  }

  function displaySuggestions(suggestions) {
    const container = document.getElementById('suggestions-container');
    container.innerHTML = '';

    suggestions.forEach(suggestion => {
      const div = document.createElement('div');
      div.textContent = suggestion;
      div.addEventListener('click', () => {
        inputElement.value = suggestion;
        container.innerHTML = '';
      });
      container.appendChild(div);
    });
  }

  function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() => func.apply(this, args), delay);
    };
  }

  const debouncedHandleInput = debounce(handleInput, 300);
  inputElement.addEventListener('input', debouncedHandleInput);
</script>

进阶优化方向

数据源获取
可改为从API异步获取数据:

async function fetchSuggestions(query) {
  const response = await fetch(`/api/suggestions?q=${query}`);
  return await response.json();
}

样式优化
为建议列表添加CSS样式,提升用户体验:

#suggestions-container {
  border: 1px solid #ccc;
  max-height: 200px;
  overflow-y: auto;
}

#suggestions-container div {
  padding: 8px;
  cursor: pointer;
}

#suggestions-container div:hover {
  background-color: #f0f0f0;
}

键盘导航
添加键盘上下键选择功能:

js实现联想输入

let currentSelection = -1;

inputElement.addEventListener('keydown', (e) => {
  const items = document.querySelectorAll('#suggestions-container div');

  if (e.key === 'ArrowDown') {
    currentSelection = Math.min(currentSelection + 1, items.length - 1);
    updateSelection(items);
  } else if (e.key === 'ArrowUp') {
    currentSelection = Math.max(currentSelection - 1, -1);
    updateSelection(items);
  } else if (e.key === 'Enter' && currentSelection >= 0) {
    inputElement.value = items[currentSelection].textContent;
    document.getElementById('suggestions-container').innerHTML = '';
  }
});

function updateSelection(items) {
  items.forEach((item, index) => {
    item.style.backgroundColor = index === currentSelection ? '#ddd' : '';
  });
}

标签: js
分享给朋友:

相关文章

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…