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

yizhihongxing

下面我将详细讲解如何实现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日

相关文章

  • 用javascript实现计算两个日期的间隔天数

    使用JavaScript可以通过对日期对象进行操作来计算两个日期的间隔天数。下面将给出一个完整的攻略,包含以下步骤: 创建两个日期对象 可以使用 new Date() 来创建日期对象。例如,我们要计算从今天(2019年4月10日)到某一天(例如2019年5月1日)的间隔天数,可以按照如下方式创建日期对象: var startDate = new Date(‘…

    JavaScript 2023年5月27日
    00
  • HTML5打开手机扫码功能及优缺点

    HTML5中提供了WebAPI,其中的一个功能是通过调用摄像头打开二维码扫码功能。使用该功能需要前端开发者在代码中集成相应的API,同时也需要从后端获取相关的数据。下面是详细的步骤和注意事项。 步骤一:引入JsQRScanner库 使用JsQRScanner库可以更方便地实现扫描二维码的功能。该库已经包含了需要的API和代码,只需要直接引入即可。在HTML的…

    JavaScript 2023年6月11日
    00
  • js将字符串转成正则表达式的实现方法

    让我来详细讲解一下“JS将字符串转成正则表达式的实现方法”的攻略。 使用RegExp构造函数 我们可以使用JavaScript中的RegExp构造函数将字符串转成正则表达式。RegExp对象是一个具有预定义属性和方法的内置JavaScript对象,它可以用来创建正则表达式对象。下面是一个例子: const patternString = ‘test’; //…

    JavaScript 2023年5月28日
    00
  • Python中还原JavaScript的escape函数编码后字符串的方法

    下面是详细讲解 Python 中还原 JavaScript 的 escape 函数编码后字符串的方法的完整攻略: 1. 什么是 JavaScript 的 escape 函数? JavaScript 的 escape 函数是一种将字符串编码成可在 URL 中传输的形式的方法。该函数可以用来防止 URL 路径中出现非法字符或中文字符时乱码。它会将非 ASCII …

    JavaScript 2023年5月19日
    00
  • websocket直接绕过JS加密示例及思路原理

    下面是对“websocket直接绕过JS加密示例及思路原理”的完整攻略。 什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得浏览器和服务器之间的数据交换变得更加实时和高效。 WebSocket旨在通过在数据传输过程中进行有效的适应和优化,使Web应用程序更加互动式和实时化。能够支持长时间开放的TCP连接,同时为W…

    JavaScript 2023年5月19日
    00
  • JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法

    问题描述: 在 Android 中使用 WebView 控件加载包含 JavaScript 的网页时,如果在 JavaScript 中使用 parseInt 函数,会出现转换不正确的问题。 解决方法: 在 JavaScript 中,使用 parseInt 函数时,需要注意 radix 参数的设置。如果不指定该参数,则 parseInt 函数会根据字符串的前缀…

    JavaScript 2023年5月28日
    00
  • 简短几句 通俗解释javascript的闭包

    下面是详细讲解JavaScript闭包的完整攻略: 什么是闭包? 闭包(closure)是指函数能够访问并使用其自身定义范围之外的变量。 JavaScript 中的每个函数都是一种闭包,将函数作为参数或从函数中返回函数时常会用到闭包的知识。 闭包示例1 例如,下面的代码定义了一个 name 变量,并在函数中创建了一个内部函数,返回的函数能够访问并使用 nam…

    JavaScript 2023年6月10日
    00
  • JavaScript利用append添加元素报错的解决方法

    下面是“JavaScript利用append添加元素报错的解决方法”的详细攻略: 问题描述 在使用JavaScript向HTML文档中添加元素时,我们可以使用append方法。但在使用这个方法时,有时会出现以下错误: Uncaught TypeError: Failed to execute ‘appendChild’ on ‘Node’: paramete…

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