js实现select组件的选择输入过滤代码

下面我将详细讲解如何实现JS选择输入过滤组件的代码。

1. 需求分析

在编写组件代码之前,我们需要先分析需求,明确自己要实现一个怎样的组件。本次需求分析结果如下:

  • 实现一个类似于<select>标签的输入组件
  • 该组件支持输入过滤功能,可以根据用户所输入的值进行过滤
  • 当用户输入完整的合法选项时,下拉框中会显示匹配该选项的选项值。

2. HTML 结构

组件的 HTML 结构我们以一个简单的下拉框为例进行演示。代码如下:

<div class="select-wrapper">
  <input type="text" class="select-input">
  <ul class="select-options">
    <li data-value="1">Apple</li>
    <li data-value="2">Banana</li>
    <li data-value="3">Cherry</li>
    <li data-value="4">Durian</li>
    <li data-value="5">Elderberry</li>
  </ul>
</div>

其中,<input> 标签用于表示用户输入框;<ul> 标签用于表示下拉框中的所有选项。在每个选项中,我们可以使用 data-value 属性存储该选项的值。

3. CSS 样式

这里给出一个 CSS 样式的例子,实现简单的样式布局。具体样式可以根据实际需要进行修改。

.select-wrapper {
  position: relative;
  width: 200px;
}

.select-input {
  width: 100%;
}

.select-options {
  position: absolute;
  top: 100%;
  left: 0;
  background-color: white;
  border: 1px solid #ddd;
  padding: 0;
  margin: 0;
  list-style: none;
  width: 100%;
  max-height: 200px;
  overflow-y: auto;
}

.select-options li {
  padding: 4px 8px;
  cursor: pointer;
}

.select-options li:hover {
  background-color: #eee;
}
  • .select-wrapper :外部容器,用于包裹整个 select 组件。
  • .select-input :输入框,用于接收用户的输入。
  • .select-options :选项容器,包含所有选项。
  • .select-options li :选项列表,所有可选项都应包含在其中。

4. JS 代码

4.1 事件绑定

我们需要在 input 元素中监听 input 事件,当用户输入内容时,我们可以根据用户输入的内容和选项值进行过滤,并更新下拉框中的选项。最后,我们在搜索框种监听 blur 事件,如果当前值和下拉框中任何一个选项值相同时, 将其设置为当选值。

const selectInput = document.querySelector(".select-input");
const selectOptions = document.querySelectorAll(".select-options li");

// 输入框输入时过滤选项
selectInput.addEventListener("input", function () {
  const keyword = this.value.trim().toLowerCase();
  selectOptions.forEach(function (option) {
    const text = option.innerText.toLowerCase();
    const value = option.dataset.value;
    if (text.indexOf(keyword) === -1) {
      option.setAttribute("hidden", "");
    } else {
      option.removeAttribute("hidden");
      if (text === keyword) {
        selectInput.value = option.innerText;
      }
    }
  });
});

// 键盘上下键,选中对应的选项
selectInput.addEventListener("keydown", function (e) {
    if (e.keyCode === 13) {
      const selectedOption = document.querySelector(".select-options li:not([hidden])");
      if (selectedOption) {
        selectInput.value = selectedOption.innerText;
      }
    } else if (e.keyCode === 38 || e.keyCode === 40) {
      const currentOption = document.querySelector(".select-options li:hover");
      let index = 0;
      selectOptions.forEach(function (option, i) {
        if (option === currentOption) {
          index = i;
        }
      });
      if (e.keyCode === 38) {
        index--;
      } else if (e.keyCode === 40) {
        index++;
      }
      index = (index + selectOptions.length) % selectOptions.length;
      selectOptions[index].scrollIntoView();
    }
});

// 点击页面其他位置 隐藏下拉框
document.addEventListener("click", function (e) {
  if (!selectInput.contains(e.target)) {
    selectOptions.forEach(function (option) {
      option.setAttribute("hidden", "");
    });
  }
});

// 当确定选项时,隐藏选项
selectInput.addEventListener("blur", function () {
  const selectedOption = document.querySelector(
    '.select-options li[data-value="' + this.value + '"]'
  );
  if (selectedOption) {
    selectInput.value = selectedOption.innerText;
  }
});

4.2 示例演示

我们针对上述需求为例,提供如下两个简单的示例:

示例一:选择一种水果

<div class="select-wrapper">
  <input type="text" class="select-input">
  <ul class="select-options">
    <li data-value="1">Apple</li>
    <li data-value="2">Banana</li>
    <li data-value="3">Cherry</li>
    <li data-value="4">Durian</li>
    <li data-value="5">Elderberry</li>
  </ul>
</div>

示例二:选择地区

<div class="select-wrapper">
  <input type="text" class="select-input">
  <ul class="select-options">
    <li data-value="1">Beijing</li>
    <li data-value="2">Shanghai</li>
    <li data-value="3">Guangzhou</li>
    <li data-value="4">Shenzhen</li>
    <li data-value="5">Chengdu</li>
  </ul>
</div>

针对此两个示例提供的代码,用户可以自由地进行修改,根据自己的实际需求定制化选择输入过滤组件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现select组件的选择输入过滤代码 - Python技术站

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

相关文章

  • JS中promise特点与信任问题解决

    JS中的Promise是一种异步编程的解决方案,它可以有效地管理异步操作,使得代码更具可读性和可维护性。在使用Promise的过程中,需要注意Promise的特点以及信任问题的解决方法。 Promise的特点 Promise有三种状态:pending、fulfilled和rejected。一般情况下,Promise是从pending状态开始,经过异步操作后,…

    JavaScript 2023年5月28日
    00
  • 动态添加删除表格行的js实现代码

    下面我将为您详细讲解 “动态添加删除表格行的js实现代码” 的完整攻略。 目录 实现原理 添加表格行的示例代码 删除表格行的示例代码 总结 1. 实现原理 要实现动态添加删除表格行的功能,需要用到 JavaScript。其实现原理可以简单概括为:当用户点击“添加行”按钮时,就会触发一个事件,这个事件会执行 JavaScript 代码,将一行新的表格行添加到表…

    JavaScript 2023年6月11日
    00
  • 使用js获取url中的参数并返回一个对象方式

    获取URL中的参数对于前端开发来说是一个很常见的需求,这里介绍两种使用JS获取URL参数并返回一个对象的方法。 方法一:使用URLSearchParams URLSearchParams是浏览器提供的一个内置对象,可以方便的获取URL参数。以下是具体的实现过程: function getSearchParams() { const params = new …

    JavaScript 2023年5月28日
    00
  • jQuery框架实现元素显示及隐藏三种动画方式

    当我们需要在网站中实现元素的显示与隐藏的动画效果时,可以使用jQuery框架提供的三种动画方式。接下来我将详细讲解JavaScpt框架的三种动画方式的实现方法,让你可以轻松实现网站元素的动画效果。 1. jQuery框架fadeIn/fadeOut实现元素渐隐/渐显 1.1 动画效果简介 当我们需要在网站中实现元素的淡出/淡入效果时,可以使用jQuery框架…

    JavaScript 2023年6月11日
    00
  • javascript 通过封装div方式弹出div窗体

    下面是JavaScript通过封装div方式弹出div窗体的攻略,包含以下几个步骤: 步骤1:创建一个DIV窗体 我们可以使用HTML标记创建一个DIV窗体,比如: <div id="myDiv" style="display:none;"> 这是弹出窗体的内容。 </div> 这里创建了一个I…

    JavaScript 2023年6月11日
    00
  • JavaScript实现解析INI文件内容的方法

    当我们需要从INI文件中获取数据时,可以使用JavaScript实现解析INI文件内容的方法。以下是具体的步骤: 读取INI文件内容 通过使用 XMLHttpRequest 对象可以获取本地或远程的INI文件内容。 例如: const xhr = new XMLHttpRequest(); xhr.open(‘GET’, ‘/path/to/file.ini…

    JavaScript 2023年5月27日
    00
  • 利用Math.js解决JS计算小数精度丢失问题

    利用Math.js解决JS计算小数精度丢失问题的完整攻略 问题描述 在JavaScript中进行小数运算时,会容易出现精度丢失的问题,例如在进行两个小数相加时,结果并不是预期的精确值,而是一个近似值。 例如: console.log(0.1 + 0.2); // 0.30000000000000004 解决方案 解决小数精度丢失问题的最简单方法是使用第三方库…

    JavaScript 2023年5月28日
    00
  • JavaScript进阶教程(第一课)第3/3页

    下面我将为您详细讲解“JavaScript进阶教程(第一课)第3/3页”的完整攻略。 1. 确定目标 首先,我们要明确自己的目标是什么,这有助于我们更好地制定学习计划。对于“JavaScript进阶教程(第一课)第3/3页”这个教程来说,我们的目标应该是掌握以下内容: 理解 JavaScript 中的数据类型 掌握 JavaScript 对象的使用方法 学习…

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