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

想要实现输入提示(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日

相关文章

  • ES6新特性之变量和字符串用法示例

    ES6新特性之变量和字符串用法示例 ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,增加了许多新特性,对于前端和后端开发人员来说有很大的用途。本篇攻略将会介绍ES6新特性之变量和字符串用法,并附上两个示例说明。 let和const关键字 ES6引入了let和const两个关键字,用于定义变量。let是用于定义块级作用域变量,而c…

    JavaScript 2023年5月28日
    00
  • JavaScript面向对象中接口实现方法详解

    JavaScript面向对象中接口实现方法详解 在JavaScript面向对象编程中,我们常常需要定义接口(interface)来规定类(class)必须实现的方法。在本篇攻略中,我们将详细讲解如何实现JavaScript中的接口。 什么是接口? 在编程中,接口是一种规范或者约束,它定义了类或者对象应该实现的方法或者属性。接口规定了类或者对象必须实现的一组方…

    JavaScript 2023年5月27日
    00
  • JS重要知识点小结

    JS重要知识点小结 1. 变量与数据类型 1.1 变量声明与赋值 在JS中,我们声明一个变量需要使用var关键字,赋值则使用=号,如下所示: var num = 5; //声明并赋值一个数值型变量 var str = ‘hello’; //声明并赋值一个字符串型变量 var arr = [1,2,3]; //声明并赋值一个数组型变量 1.2 数据类型 在JS…

    JavaScript 2023年6月10日
    00
  • 用JS写的简单的计算器实现代码

    下面是用JS写的简单的计算器实现的完整攻略,包含两条示例说明。 标题 用JS写的简单的计算器实现代码 环境准备 在开始实现计算器之前,需要准备好以下环境: 浏览器:比如Chrome、Firefox等主流浏览器。 HTML文件:用于显示计算器界面和加载JS文件。 JS文件:用于编写实际的计算器代码。 计算器的HTML界面 首先,需要编写计算器的HTML界面。下…

    JavaScript 2023年5月28日
    00
  • javascript实现缓动动画效果

    下面是详细讲解“JavaScript实现缓动动画效果”的攻略。 什么是缓动动画? 缓动动画是在动画开始和结束的时候逐渐加速或减速,它不像匀速动画那样是一直保持同样的速度,而是可控的速度随时间而变化。 缓动动画的实现原理 缓动动画的实现原理是利用数学函数计算每一帧动画的时间间隔和位置坐标,并根据计算结果以定时器的方式实现动画效果。 常用的缓动函数有很多,比如线…

    JavaScript 2023年6月10日
    00
  • webpack HappyPack实战详解

    webpack HappyPack实战详解 什么是 HappyPack HappyPack是一个webpack插件,可以将代码在多个子进程中并行编译,提高构建的速度。 HappyPack使用 使用步骤: 安装 HappyPack: npm install happypack -D 引入 HappyPack: js const HappyPack = requ…

    JavaScript 2023年5月28日
    00
  • JavaScript 原型继承

    JavaScript 原型继承 JavaScript 原型继承是一种非常重要的概念,相较于传统的面向对象语言中的继承,JavaScript 通过原型继承来实现对象之间的属性和方法的共享,它是 JavaScript 中最为灵活的一种继承方式。 定义 JavaScript 中的每个对象(除了 null)都有一个原型对象,原型对象可以通过 Object.getPr…

    JavaScript 2023年6月10日
    00
  • JS中call/apply、arguments、undefined/null方法详解

    JS中call/apply、arguments、undefined/null方法详解 本文将详细讲解JavaScript中的call、apply、arguments、undefined和null这几个常用的方法,希望能帮助读者更好地理解它们的用法和意义。 call和apply的用法 call和apply的作用是改变函数的执行上下文,也就是函数中this的指向…

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