当前位置:首页 > JavaScript

js实现联想输入

2026-03-01 06:18:43JavaScript

实现联想输入的基本思路

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

监听输入事件

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

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

匹配数据逻辑

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

js实现联想输入

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);
  });
}

防抖优化

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

js实现联想输入

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;
}

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

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实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统…

js实现论坛

js实现论坛

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