一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能

要实现一个用JavaScript写的Select支持上下键、首字母筛选以及回车取值的功能可以分为以下几个步骤:

  1. 创建一个select元素并隐藏原生的下拉列表。可以使用CSS的display:none或者position:absolute; left:-9999px; 等方法来实现。
<select id="mySelect" style="display:none;">
  <option value="opt1">Option 1</option>
  <option value="opt2">Option 2</option>
  <option value="opt3">Option 3</option>
  <option value="opt4">Option 4</option>
  <option value="opt5">Option 5</option>
</select>
  1. 创建一个文本框用来模拟下拉列表,并在其下方插入一个显示选项的列表框。同时在文本框的keydown事件中添加上下键和回车键的事件处理函数。
<div style="position:relative;">
  <input id="mySelectTxt" placeholder="请选择" />
  <ul id="mySelectList"></ul>
</div>
const mySelect = document.getElementById('mySelect');
const mySelectTxt = document.getElementById('mySelectTxt');
const mySelectList = document.getElementById('mySelectList');
let options = [];
for (let opt of mySelect.options) {
  options.push(opt.textContent);
}
function filterOptions(keyword) {
  return options.filter(o => o.toLowerCase().startsWith(keyword.toLowerCase()));
}
function updateList(keyword) {
  const filteredOptions = filterOptions(keyword);
  mySelectList.innerHTML = '';
  for (let opt of filteredOptions) {
    const li = document.createElement('li');
    li.textContent = opt;
    li.addEventListener('click', () => {
      mySelectTxt.value = opt;
      mySelect.focus();
      mySelectList.innerHTML = '';
    });
    mySelectList.appendChild(li);
  }
}
mySelectTxt.addEventListener('keydown', e => {
  if (e.keyCode === 38) { // Up arrow
    if (mySelectList.childNodes.length > 0) {
      const selected = mySelectList.querySelector('.selected');
      if (selected) {
        if (selected.previousSibling) {
          selected.classList.remove('selected');
          selected.previousSibling.classList.add('selected');
        }
      } else {
        mySelectList.lastChild.classList.add('selected');
      }
    }
  } else if (e.keyCode === 40) { // Down arrow
    if (mySelectList.childNodes.length > 0) {
      const selected = mySelectList.querySelector('.selected');
      if (selected) {
        if (selected.nextSibling) {
          selected.classList.remove('selected');
          selected.nextSibling.classList.add('selected');
        }
      } else {
        mySelectList.firstChild.classList.add('selected');
      }
    }
  } else if (e.keyCode === 13) { // Enter
    const selected = mySelectList.querySelector('.selected');
    if (selected) {
      mySelectTxt.value = selected.textContent;
    }
    mySelect.focus();
    mySelectList.innerHTML = '';
  }
});
mySelectTxt.addEventListener('input', e => {
  updateList(e.target.value);
});
  1. 在文本框的input事件中筛选出符合输入框内内容的下拉列表选项并展示出来。可以使用字符串的indexOf或正则表达式等方式来搜索符合条件的选项,并展示出来。
function filterOptions(keyword) {
  return options.filter(o => o.toLowerCase().startsWith(keyword.toLowerCase()));
}
function updateList(keyword) {
  const filteredOptions = filterOptions(keyword);
  mySelectList.innerHTML = '';
  for (let opt of filteredOptions) {
    const li = document.createElement('li');
    li.textContent = opt;
    li.addEventListener('click', () => {
      mySelectTxt.value = opt;
      mySelect.focus();
      mySelectList.innerHTML = '';
    });
    mySelectList.appendChild(li);
  }
}
mySelectTxt.addEventListener('input', e => {
  updateList(e.target.value);
});

示例1:

<select id="mySelect" style="display:none;">
  <option value="1">China</option>
  <option value="2">Japan</option>
  <option value="3">South Korea</option>
  <option value="4">Thailand</option>
  <option value="5">Indonesia</option>
  <option value="6">Vietnam</option>
  <option value="7">Malaysia</option>
  <option value="8">Singapore</option>
  <option value="9">Philippines</option>
</select>

<div style="position:relative;">
  <input id="mySelectTxt" placeholder="请选择" />
  <ul id="mySelectList"></ul>
</div>

<script>
const mySelect = document.getElementById('mySelect');
const mySelectTxt = document.getElementById('mySelectTxt');
const mySelectList = document.getElementById('mySelectList');
let options = [];
for (let opt of mySelect.options) {
  options.push(opt.textContent);
}
function filterOptions(keyword) {
  return options.filter(o => o.toLowerCase().startsWith(keyword.toLowerCase()));
}
function updateList(keyword) {
  const filteredOptions = filterOptions(keyword);
  mySelectList.innerHTML = '';
  for (let opt of filteredOptions) {
    const li = document.createElement('li');
    li.textContent = opt;
    li.addEventListener('click', () => {
      mySelectTxt.value = opt;
      mySelect.focus();
      mySelectList.innerHTML = '';
    });
    mySelectList.appendChild(li);
  }
}
mySelectTxt.addEventListener('input', e => {
  updateList(e.target.value);
});
</script>

示例2:

<select id="mySelect" style="display:none;">
  <option value="option1">Red</option>
  <option value="option2">Green</option>
  <option value="option3">Blue</option>
  <option value="option4">Yellow</option>
  <option value="option5">Black</option>
  <option value="option6">White</option>
</select>

<div style="position:relative;">
  <input id="mySelectTxt" placeholder="请选择" />
  <ul id="mySelectList"></ul>
</div>

<script>
const mySelect = document.getElementById('mySelect');
const mySelectTxt = document.getElementById('mySelectTxt');
const mySelectList = document.getElementById('mySelectList');
let options = [];
for (let opt of mySelect.options) {
  options.push(opt.textContent);
}
function filterOptions(keyword) {
  return options.filter(o => o.toLowerCase().startsWith(keyword.toLowerCase()));
}
function updateList(keyword) {
  const filteredOptions = filterOptions(keyword);
  mySelectList.innerHTML = '';
  for (let opt of filteredOptions) {
    const li = document.createElement('li');
    li.textContent = opt;
    li.addEventListener('click', () => {
      mySelectTxt.value = opt;
      mySelect.focus();
      mySelectList.innerHTML = '';
    });
    mySelectList.appendChild(li);
  }
}
mySelectTxt.addEventListener('input', e => {
  updateList(e.target.value);
});
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能 - Python技术站

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

相关文章

  • js数组去重的常用方法总结

    好,下面是关于“js数组去重的常用方法总结”的完整攻略。 js数组去重的常用方法总结 一、利用Set去重 ES6新增了Set容器,可以创建一个不重复的集合。因此,利用Set可以快速去重,代码如下: const arr = [1, 2, 3, 3, 4, 5, 4]; const result = Array.from(new Set(arr)); // [1…

    JavaScript 2023年5月27日
    00
  • JS判断浏览器之Navigator对象

    一、在JS中判断用户的浏览器可以使用Navigator对象,具体的步骤如下: 1.获取Navigator对象。在JS中,可以通过window.navigator属性来获取Navigator对象。 2.获取浏览器信息。在Navigator对象中,有一些属性可以获取浏览器的信息,如: userAgent:浏览器的User Agent字符串,可以用来检测浏览器的类…

    JavaScript 2023年6月11日
    00
  • JavaScript实现url参数转成json形式

    当我们使用JavaScript处理URL的参数时,有时候需要将URL的参数转换为JSON形式来进行处理。下面我将为您提供JavaScript实现URL参数转为JSON的完整攻略: 利用window.location.search获取URL参数部分; 将URL参数部分解析为键值对对象; 将对象转换为JSON格式。 下面是详细步骤的代码实现: 1. 利用wind…

    JavaScript 2023年5月27日
    00
  • 基于js 各种排序方法和sort方法的区别(详解)

    针对“基于js 各种排序方法和sort方法的区别(详解)”这个话题,我将从以下几个方面进行详细讲解。 一、基础排序算法 在介绍各种排序算法之前,我们先了解一下几个基础排序算法:冒泡排序、插入排序和选择排序。 1. 冒泡排序 冒泡排序的基本思路是比较相邻的元素,如果前面的元素比后面的大,则交换这两个元素。每完成一轮比较,就可以确定一个最大的元素,并且这个最大的…

    JavaScript 2023年6月11日
    00
  • js学使用setTimeout实现轮循动画

    接下来我将分享使用setTimeout实现轮循动画的攻略。 什么是setTimeout函数? 在介绍如何使用setTimeout实现轮循动画之前,我们需要了解一下什么是setTimeout函数。 setTimeout函数是JavaScript中一个非常重要的函数,它的作用是在指定的时间后执行一段指定的函数。由于setTimeout是异步函数,所以它不会影响当…

    JavaScript 2023年6月11日
    00
  • 详解javascript的变量与标识符

    我们来详细讲解JavaScript的变量与标识符。 变量 在JavaScript中,变量是用于存储数据的容器,它们可以被任何地方引用或更改。在使用变量之前,需要先声明它们,以告诉JavaScript编译器它们的类型。 声明变量有三种方式: 使用var关键字 var name = ‘张三’; 使用let关键字(ES6新增) let age = 20; 使用co…

    JavaScript 2023年5月18日
    00
  • javascript判断网页是关闭还是刷新

    要判断网页是被关闭还是被刷新,需要使用onbeforeunload事件和event.currentTarget.performance.navigation.type属性。 onbeforeunload事件会在页面关闭或者刷新时被触发,可以作为判断依据。而event.currentTarget.performance.navigation.type属性在页面…

    JavaScript 2023年6月11日
    00
  • 前端面试知识点锦集(JavaScript篇)

    下面我将详细讲解“前端面试知识点锦集(JavaScript篇)”的完整攻略。 本文概述 在本篇文章中,我们将总结并详细讲解一些前端面试中常见的JavaScript知识点,包括数据类型、变量、作用域、闭包、原型链、异步编程等等。这些知识点在前端开发中非常重要,也是面试中经常会问到的内容。 JavaScript数据类型 JavaScript有七种数据类型,分别是…

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