用js实现输入提示(自动完成)的实例代码

yizhihongxing

想要实现输入提示(autocomplete)功能,我们通常需要以下几个步骤:

1. 获取用户输入

在实现自动完成功能之前,我们首先需要获取用户的输入。在网页中,我们可以通过<input>标签来实现用户输入信息的获取,例如:

<label for="username">用户名:</label>
<input type="text" id="username" name="username" />

在以上代码中,<input>标签中的type属性为text,即表示这是一个文本输入框。用户在文本输入框中输入的内容可以通过对应的value属性来获取,例如:

const inputEl = document.querySelector('#username');
const userInput = inputEl.value;

通过上述代码,就可以获取用户输入的值了。

2. 获取数据源

在实现输入提示功能时,我们通常需要从服务器或者本地数据源中获取数据,以便在用户输入时能够进行匹配。下面是一个简单的本地数据源示例:

const dataList = ['apple', 'banana', 'orange', 'pear'];

在实际应用中,我们通常需要从后端接口获取数据。可以使用 Ajax 或者 Fetch API 来向服务器获取数据。

3. 监听用户输入

获取用户输入后,我们需要以某种方式来监听用户输入,以实现实时匹配提示。一般来说,我们需要监听文本输入框的 input 或者 keyup 事件。input 事件在用户输入后实时触发,而 keyup 事件则需要用户松开按键后才会触发。下面是以 input 事件为例的代码:

const inputEl = document.querySelector('#username');

inputEl.addEventListener('input', e => {
  const userInput = e.target.value;
  // TODO: 处理自动提示逻辑
})

4. 实现自动提示

当用户输入数据时,我们需要在数据源中进行匹配,并将匹配结果展示给用户。下面是一个简单的实现方式:

const inputEl = document.querySelector('#username');
const dataList = ['apple', 'banana', 'orange', 'pear'];

inputEl.addEventListener('input', e => {
  const userInput = e.target.value;
  const matchedItems = dataList.filter(item => item.includes(userInput));
  renderMatchedItems(matchedItems);
});

function renderMatchedItems(matchedItems) {
  const datalistEl = document.querySelector('#datalist');

  // 清空已有的选项
  while (datalistEl.firstChild) {
    datalistEl.removeChild(datalistEl.firstChild);
  }

  // 添加匹配到的选项
  matchedItems.forEach(item => {
    const optionEl = document.createElement('option');
    optionEl.value = item;
    datalistEl.appendChild(optionEl);
  });
}

以上代码中,我们首先通过 filter 方法在数据源中筛选出了符合条件的选项,然后调用了 renderMatchedItems 函数来动态添加选项。

示例1

以下是一个更复杂的示例,我们使用 Fetch API 从后端获取数据并实现自动完成功能。

<label for="country">选择国家:</label>
<input type="text" id="country" name="country" list="datalist" />

<datalist id="datalist"></datalist>
const inputEl = document.querySelector('#country');
const datalistEl = document.querySelector('#datalist');

inputEl.addEventListener('input', e => {
  const userInput = e.target.value.trim();
  if (userInput === '') {
    return;
  }

  fetch(`/api/countries?q=${encodeURIComponent(userInput)}`)
    .then(response => response.json())
    .then(data => {
      renderMatchedItems(data);
    });
});

function renderMatchedItems(matchedItems) {
  // 清空已有的选项
  while (datalistEl.firstChild) {
    datalistEl.removeChild(datalistEl.firstChild);
  }

  // 添加匹配到的选项
  matchedItems.forEach(item => {
    const optionEl = document.createElement('option');
    optionEl.value = item.name;
    datalistEl.appendChild(optionEl);
  });
}

以上代码中,我们通过 fetch 方法向 /api/countries 接口发送请求,以获取用户输入值匹配的国家名称列表,并调用 renderMatchedItems 函数来更新选项列表。

示例2

以下是另一个示例,我们添加了键盘上下键和回车键的监听,并在用户选择匹配项时将其填入输入框。

<label for="province">选择省份:</label>
<input type="text" id="province" name="province" list="datalist" />

<datalist id="datalist"></datalist>
const inputEl = document.querySelector('#province');
const datalistEl = document.querySelector('#datalist');

let currentActiveIndex = -1;

inputEl.addEventListener('input', e => {
  const userInput = e.target.value.trim();
  if (userInput === '') {
    return;
  }

  fetch(`/api/provinces?q=${encodeURIComponent(userInput)}`)
    .then(response => response.json())
    .then(data => {
      renderMatchedItems(data);
    });
});

inputEl.addEventListener('keydown', e => {
  const key = e.key;
  const matchedItems = Array.from(datalistEl.children);
  const len = matchedItems.length;

  if (key === 'ArrowDown') {
    // 按下下箭头键,高亮下一个选项
    currentActiveIndex++;
    if (currentActiveIndex >= len) {
      currentActiveIndex = 0;
    }
    setHighlight(matchedItems[currentActiveIndex]);
  } else if (key === 'ArrowUp') {
    // 按下上箭头键,高亮上一个选项
    currentActiveIndex--;
    if (currentActiveIndex < 0) {
      currentActiveIndex = len - 1;
    }
    setHighlight(matchedItems[currentActiveIndex]);
  } else if (key === 'Enter') {
    // 按下回车键,将选中的选项填入输入框
    const highlightedItem = datalistEl.querySelector('.highlight');
    if (highlightedItem) {
      inputEl.value = highlightedItem.value;
    }
    // 隐藏选项列表
    datalistEl.innerHTML = '';
  }
});

function renderMatchedItems(matchedItems) {
  // 清空已有的选项
  while (datalistEl.firstChild) {
    datalistEl.removeChild(datalistEl.firstChild);
  }

  // 添加匹配到的选项
  matchedItems.forEach(item => {
    const optionEl = document.createElement('option');
    optionEl.value = item.name;
    datalistEl.appendChild(optionEl);
  });
}

function setHighlight(item) {
  Array.from(datalistEl.children).forEach(el => {
    el.classList.remove('highlight');
  });
  if (item) {
    item.classList.add('highlight');
  }
}

以上代码中,我们新增了对 keydown 事件的监听,并实现了上下箭头和回车键的响应逻辑。setHighlight 函数用来设置被高亮的选项;currentActiveIndex 用来标记当前高亮的选项。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用js实现输入提示(自动完成)的实例代码 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 利用js正则表达式验证手机号,email地址,邮政编码

    对于利用js正则表达式验证手机号、email地址、邮政编码,可以按照以下步骤进行: 一、编写正则表达式 验证手机号 手机号码一般为11位数字组成,以1开头,比较简单,可以使用以下正则表达式进行匹配: /^1[3456789]\d{9}$/ 该表达式的解释: ^ 为开始符号,表示匹配输入的开始 1 为手机号码开头的数字,即必须以1开头 [3456789] 表示…

    JavaScript 2023年5月19日
    00
  • JS实现将数字金额转换为大写人民币汉字的方法

    下面是JS实现将数字金额转换为大写人民币汉字的方法的完整攻略。 1. 需求分析 首先,我们需要明确我们的需求是将数字金额转换为大写人民币汉字格式,例如将12345.67转换为“壹万贰仟叁佰肆拾伍元陆角柒分”。 2. 算法思路 实现将数字金额转换为大写人民币汉字,需要用到数值分段、数值转换、单位处理等一系列算法。其核心思路为:将待转换的数值从小数点处分割出来,…

    JavaScript 2023年5月28日
    00
  • JS 判断某变量是否为某数组中的一个值的3种方法(总结)

    下面是关于JS判断某变量是否为某数组中的一个值的3种方法的详细攻略。 标准方法:Array.prototype.indexOf() Array对象有一个原型方法indexOf(),可以用来查找数组中是否包含某个元素。使用该方法来判断某变量是否为某数组中的一个值,需要先调用indexOf()方法查找该元素在数组中的索引值。若索引值不为 -1(即查找到该元素),…

    JavaScript 2023年5月27日
    00
  • JS简单生成由字母数字组合随机字符串示例

    当我们需要生成随机字符串的时候,可以使用JS代码来实现。下面是一些简单的JS代码示例可以生成由字母数字组合随机字符串。 方法一:使用Math.random()方法生成随机数 代码示例: /** * 生成指定长度的随机字符串(由字母数字组成) * @param {number} length 需要生成的字符串长度 * @returns {string} 生成的…

    JavaScript 2023年5月28日
    00
  • 巧用js提交表单轻松解决一个页面有多个提交按钮

    接下来我将详细讲解巧用JavaScript提交表单的攻略以及示例。 1. 为什么需要巧用JS提交表单? 在一些交互性比较强的网站中,经常会出现一个页面有多个提交按钮的情况。比如一个电商网站的购物车页面,用户可以选择继续购物或者去结算,这时候页面上就会有两个提交按钮:继续购物按钮和去结算按钮。 但是,如果我们使用普通的表单提交方式,那么页面上的每个提交按钮都会…

    JavaScript 2023年6月10日
    00
  • JavaScript DOM学习第一章 W3C DOM简介

    JavaScript DOM(Document Object Model)是用于描述文档的抽象表示形式的编程接口,它定义了一组标准对象,这些对象可以与HTML、XML或XHTML文档的元素、文本节点和属性进行交互。 本文主要介绍 W3C DOM (World Wide Web Consortium DOM)的基础知识,包括DOM的版本、DOM树结构、DOM节…

    JavaScript 2023年6月10日
    00
  • 用js重建星际争霸

    用JS重建星际争霸需要以下的步骤和技术: 基本准备 首先需要准备的是技术栈: HTML/CSS编写页面样式 Vue.js或React等框架来渲染视图和管理状态 WebGL(或者Three.js等封装库)来绘制3D场景 Node.js和Socket.io来实现多人游戏交互 同时需要准备游戏素材,在设计中包括以下元素: 战争迷雾和地图障碍 单位和建筑模型 动作和…

    JavaScript 2023年5月28日
    00
  • JS+HTML5 FileReader实现文件上传前本地预览功能

    下面我来详细讲解如何使用JS+HTML5 FileReader实现文件上传前本地预览功能。 什么是FileReader FileReader是一个HTML5规范中引入的API,可以将本地计算机上的文件读取到浏览器中。它是通过File API提供的,我们可以使用它读取文件的内容,以便进行一些操作,例如预览图片、验证文件内容等。 FileReader使用方法 使…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部