一个用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日

相关文章

  • 详解Javascript中的原型OOP

    详解JavaScript中的原型OOP 什么是原型OOP 原型OOP是指JavaScript中通过原型链实现面向对象编程的方式。它利用每个JavaScript对象都有一个指向原型的指针,通过原型链可以实现继承和复用,从而实现面向对象编程的特性。 原型链 原型链是通过每个对象都有一个指向原型的指针,从而形成的链式结构。例如: let animal = { ea…

    JavaScript 2023年6月10日
    00
  • js与jQuery实现的兼容多浏览器Ajax请求实例

    针对“js与jQuery实现的兼容多浏览器Ajax请求实例”这一主题,我将提供以下完整攻略: 步骤1:引入jQuery库到你的项目中 使用jQuery库的最简单方式是从官网下载或链接CDN,并在你的项目中引入。以下是引入jQuery的示例代码: <!DOCTYPE html> <html> <head> <title…

    JavaScript 2023年6月11日
    00
  • js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换&#XX的函数代码

    下面是详细的攻略。 js中文汉字转Unicode 在 js 中,可以使用以下代码将中文汉字转换为 Unicode 码: function chineseToUnicode(str) { var res = []; for (var i = 0; i < str.length; i++) { res[i] = ("00" + str.…

    JavaScript 2023年6月1日
    00
  • javascript引用类型之时间Date和数组Array

    接下来我会给你详细讲解JavaScript引用类型之时间Date和数组Array的完整攻略。 JavaScript引用类型之时间Date 在JavaScript中,时间是以Date对象的形式存在的。我们可以使用Date对象表示一个日期,也可以使用它来执行与日期相关的操作。 创建Date对象 创建一个Date对象的方式有以下三种: 使用new Date()构造…

    JavaScript 2023年5月27日
    00
  • js格式化时间小结

    JS 格式化时间小结 格式化时间是前端开发经常会遇到的问题之一,不同场景下需要展现的时间格式也会有所不同。在JavaScript中,我们可以使用内置的Date对象和一些方法来格式化时间。 获取当前时间 使用内置的Date对象可以获得当前时间。比如以下代码: const now = new Date(); 格式化时间 toLocaleDateString() …

    JavaScript 2023年5月27日
    00
  • uniapp定义动画的几种方式总结

    下面我会详细讲解“uniapp定义动画的几种方式总结”的完整攻略。 uniapp定义动画的几种方式总结 uniapp是一种基于Vue.js开发的跨平台框架,通过uniapp,我们可以轻松地开发出同时支持安卓和iOS的应用程序。在uniapp中定义动画,一般可以通过以下几种方式: 1. 使用CSS动画 在uniapp中,我们可以使用CSS动画来定义动画效果。具…

    JavaScript 2023年6月11日
    00
  • Javascript数组去重的几种方法详解

    当我们需要对一个JavaScript数组进行去重操作时,常见的有以下几种方法: 方法一:使用Set数据结构 在ES6中,新增了Set数据结构,它类似于数组,但成员的值都唯一,没有重复的值。我们可以通过将数组转化为Set,然后再将Set转化回数组,就可以实现去重操作。示例代码如下: const arr = [1, 2, 3, 2, 1]; const resu…

    JavaScript 2023年5月27日
    00
  • 初步了解JavaScript,Ajax,jQuery,并比较三者关系

    初步了解 JavaScript、Ajax 和 jQuery JavaScript JavaScript 是一种轻量级的编程语言,用于在网页上创建交互式的效果。它是一种客户端脚本语言,意味着它是在用户的计算机上运行的。JavaScript 在网页上增加了很多功能,例如动态数据验证、弹出窗口、动画和页面轮廓等。 Ajax Ajax 是 Asynchronous …

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