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

yizhihongxing

要实现一个用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如何区分浏览器页面是刷新还是关闭是一个比较常见的问题。具体实现方法一般是通过事件监听,监听两种事件:beforeunload和unload。 beforeunload事件 当页面即将刷新或关闭时,会触发beforeunload事件。在事件处理函数中,我们可以添加一些操作,比如弹出确认框,让用户确认是否要离开页面。 示例1:弹出确认框 window.add…

    JavaScript 2023年6月11日
    00
  • 基于JS实现Android,iOS一个手势动画效果

    要基于JS实现Android和iOS上的手势动画效果,可以按照以下步骤进行操作: 步骤1:编写HTML结构 首先,需要先创建一个HTML结构来容纳手势动画效果的元素。可以使用如下代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> …

    JavaScript 2023年6月10日
    00
  • JSON辅助格式化处理方法

    JSON格式是一种轻量级的数据交换格式,常用于前后端数据传输和存储。而格式杂乱、不易阅读的JSON数据对于开发和调试过程中处理和理解都会造成困难。因此,JSON辅助格式化处理方法就变得非常重要,本文将会详细讲解该方法的攻略。 什么是JSON格式化? JSON格式化是指通过对不可读的JSON数据按照一定的规则进行排版和缩进,使其更易于阅读和理解的过程。常规的J…

    JavaScript 2023年5月27日
    00
  • js 中{},[]中括号,大括号使用详解

    下面我来详细讲解一下 JS 中 {}、[] 中括号、大括号使用的详细攻略。 大括号 {} 大括号 {} 在 JS 中主要用于表示一个代码块,可以将多条语句组合在一起,在循环、条件语句、对象字面量等场景下经常使用。 下面是一个将数组中的奇偶数分离的示例: const arr = [1, 2, 3, 4, 5, 6]; const even = []; cons…

    JavaScript 2023年5月27日
    00
  • JavaScript中instanceof运算符的用法总结

    标题:JavaScript中instanceof运算符的用法总结 1. 简介 在JavaScript中,instanceof是一种语法特性,用于检查一个实例是否属于某个类或原型链中的某一级原型对象。该运算符通常被用来判断变量类型、判断是否为某个类的实例等。 2. 语法 instanceof 运算符的语法如下: object instanceof constr…

    JavaScript 2023年6月10日
    00
  • Bootstrap滚动监听(Scrollspy)插件详解

    Bootstrap滚动监听(Scrollspy)插件详解 Bootstrap的Scrollspy插件是一款可以自动更新导航栏的插件,可以使导航栏和页面滚动保持同步。本文将详细讲解Scrollspy插件的使用方法。 安装 在使用Bootstrap的Scrollspy插件之前,需要先引入Bootstrap的CSS和JS文件。 <!– 引入Bootstra…

    JavaScript 2023年5月27日
    00
  • Javascript中级语法快速入手

    Javascript中级语法快速入手 什么是Javascript中级语法 Javascript中级语法是一组更高阶的Javascript语言特性。与初级语法不同,它涵盖了更多复杂的用法和更繁琐的细节。 Javascript中级语法有哪些 Javascript中级语法包括但不限于以下内容: 对象:Javascript的面向对象特性 函数:更为复杂的函数定义和调…

    JavaScript 2023年5月27日
    00
  • 谈谈JavaScript数组常用方法总结

    谈谈JavaScript数组常用方法总结 1. 什么是JavaScript数组 JavaScript数组可以理解为一组有序的数据集合,可以存储任意类型的数据,包括数字、字符串、对象、函数等等。数组是JavaScript中最常用的数据结构之一,因为它能够快速方便地对数据进行排序、搜索、过滤、截取等操作。 2. JavaScript数组常用方法 下面列举了一些常…

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