js实现下拉框可输入

前言

众所周知,html默认的下拉框是无法输入值的,然后最新的办法是用datalist和输入框绑定,但是很多浏览器不支持。然后还有很多框架提供的下拉框都是可输入的。但是公司的项目太老了,考虑到依赖性需要使用原生js去实现。

业务是这样,现在有一个输入框存在,需要在不改变这个输入框id的情况下让这个输入框能实现下拉框的效果。

代码实现

Js代码

我编写了一个函数用于接收元素id和下拉框的列表数据,函数内部需要完成下拉框的创建。

首先获取需要变成下拉框的输入框id,然后创建ul元素,然后为ul元素添加css属性,css代码在文章结尾。通过循环去创建li元素,在循环的内部不仅要创建li元素,还要为每个li设置data-key自定义属性作为下拉框的key。还需要为每个下拉框创建点击事件,也就是选中下拉框某个内容时,将li的内容赋值给input框,然后隐藏下拉框因为已经完成了选中操作。

hideOtherDropdowns隐藏未使用的下拉框,当我有多个下拉框的时候,点击第一个下拉框,再点击第二个下拉框的时候要让之前的下拉框隐藏,防止多个下拉框同时展开。

然后还需要为input框添加点击事件,当我点击input框的时候显示下拉列表,还需要为每个document添加点击事件,我点击其他dom的时候下拉框要隐藏,比如其他输入框,页面空白处。

最后将ul元素添加到input元素后面,并设置为relative定位模式。

window.addEventListener("DOMContentLoaded", function() {
var options = [
{ key: "1", value: "选项1" },
{ key: "2", value: "选项2" },
{ key: "3", value: "选项3" },
{ key: "4", value: "选项4" }
];
renderDropdown("test", options);
renderDropdown("test2", options);
}); function renderDropdown(id, options) {
var input = document.getElementById(id);
var dropdown = document.createElement("ul"); dropdown.classList.add("dropdown-options"); for (var i = 0; i < options.length; i++) {
var option = document.createElement("li");
option.textContent = options[i].value;
option.setAttribute("data-key", options[i].key);
option.addEventListener("click", function() {
input.value = this.textContent; // 将选中的值赋给 input
var selectedKey = this.getAttribute("data-key");
console.log("Selected key:", selectedKey);
dropdown.classList.remove("show");
console.log(input.value)
});
dropdown.appendChild(option);
} function hideOtherDropdowns()
{
var otherDropdowns = document.querySelectorAll(".dropdown-options");
for (var j = 0; j < otherDropdowns.length; j++)
{ if (otherDropdowns[j] !== dropdown)
{
otherDropdowns[j].classList.remove("show");
}
}
}
input.addEventListener("click", function(e) {
hideOtherDropdowns();
//e.stopPropagation()的作用是阻止事件冒泡,使事件只在当前元素上触 发执行,不会继续传播到其他元素上。
e.stopPropagation();
dropdown.classList.toggle("show");
}); document.addEventListener("click", function() {
dropdown.classList.remove("show");
}); input.insertAdjacentElement("afterend", dropdown);
input.parentNode.style.position = "relative"; // 设置父元素的定位为相对定位
}

Css代码

.test {
position: relative;
width: 200px;
padding: 10px;
border: 1px solid #ccc;
cursor: pointer;
background-color: #fff;
}
.dropdown-options {
position: absolute;
left: 0;
width: auto;
max-height: 200px;
overflow-y: auto;
list-style-type: none;
margin: 0;
padding: 0;
background-color: #fff;
border: 1px solid #ccc;
border-top: none;
z-index: 999;
display: none;
}
.show{
display: block;
}
.dropdown-options li {
padding: 10px;
cursor: pointer;
}
.dropdown-options li:hover {
background-color: #f2f2f2;
}

Html代码

<input id="test" type="text" class="test" placeholder="请选择"/>
<br/>
<input id="test2" type="text" class="test" placeholder="请选择"/>

实现效果

原生js实现下拉框可输入的更多相关文章

  1. 原生js获取下拉框下标

    // 获取下拉框所选下标 传入下拉框的id function getselectscheckitemindex (idStr) { let o = document.getElementById(id ...

  2. JS为Select下拉框添加输入功能

    JavaScript使用parentNode.nextSibling.value实现的本功能,实际上你会发现网页上有两个控件元素,一个是Select,一个是input,使用CSS将input覆盖于se ...

  3. Js获取下拉框选定项的值和文本

    Js获取下拉框的值和文本网上提供了2种方法:但有些人很不负责任,他们根本没考虑到浏览器之间的差异导致的错误,导致很多新手琢磨了半天找不出错误! 下面我总结下Firefox和IE下获取下拉框选定项的值和 ...

  4. JS模拟下拉框select

    最近做的一个项目有下拉框 同事都是用的是美化控件,但是用美化控件当然是好 但是网上找的一个控件不知道扩展性怎么样?对以后的维护会不会造成有影响?比如我想增加一个功能或者减少一个功能会不会影响?还有就是 ...

  5. js改变下拉框内容

      js改变下拉框内容 CreateTime--2018年4月8日18:47:38 Author:Marydon 适用场景:通常情况下,级联菜单.通过ajax异步获取后台数据改写下拉框内容会有这种需求 ...

  6. JS 实现下拉框去重

    JS 实现下拉框去重 学习内容: 需求 总结: 学习内容: 需求 用 JS 下拉框去重 实现代码 <html> <head> <meta http-equiv=" ...

  7. JS 实现下拉框回显

    JS 实现下拉框回显 学习内容: 需求 总结: 学习内容: 需求 用 JS 实现下拉框回显 实现代码 <!DOCTYPE html> <html lang="en" ...

  8. 基于bootstrap-multiselect.js的下拉框联动

    背景:当option特别多时,一般的下拉框选择起来就有点力不从心了,所以使用multiselect是个很好的选择,可以通过输入文字来选择选项很方便,但是有一个需要下拉框联动,网上找了半天才找到解决方法 ...

  9. JS实现下拉框选中不同的项,对应显示不同的信息

    实现的效果如下图: 页面代码 下拉框: <select id="select3" name="select3" onchange="showli ...

  10. 快速解决js开发下拉框中blur与click冲突

    在开发中我们会经常遇到blur和click冲突的情况.下面叙述了开发中常遇到的"下拉框"的问题,并提供了两种解决方案. 一.blur和click事件简述 blur事件:当元素失去焦 ...

随机推荐

  1. jqGrid--设置单元格字体颜色

    colModel: [ { name: '列名称', index: '列名称', width: 65, sortable: true, resizable: false, cellattr: addC ...

  2. SpringMVC学习三(静态资源/AJAX功能/乱码问题)

    静态资源的映射 Springmvc完成ajax功能 SpringMVC返回中文到ajax乱码问题解决方式 1.静态资源映射 对于之前web.xml配置文件中的 先做出如下更改,不可写"/*& ...

  3. 八、Doris外部表及数据导入

    DorisDB提供了多种导入方式,用户可以根据数据量大小.导入频率等要求选择最适合自己业务需求的导入方式. 数据导入:  1.离线数据导入:如果数据源是Hive/HDFS,推荐采用 Broker Lo ...

  4. 这几个好用的 Google 搜索技巧,让你飞起!

    搜索能力是被绝大多数人低估一项基本素质,绝大部分做编程技术相关的朋友应该都知道如何使用 Google,但是并不知道如何利用它的潜力.其实不管是 Google 还是 百度,会搜索的人一样都可以查找到需要 ...

  5. WEB服务与NGINX(6)-location使用详解

    目录 1. location的详细用法 1.1 精确匹配 1.2 区分大小写 1.3 不区分大小写 1.4 匹配URI开始 1.5 测试location的优先级 1.6 location的生产使用示例 ...

  6. make编译报错:fatal error: filesystem: 没有那个文件或目录 #include <filesystem>

    报错: fatal error: filesystem: 没有那个文件或目录 #include(filesystem) 解决方法一: 修改头文件 #include <experimental/f ...

  7. fastposter v2.18.0 一分钟完成开发海报-云服务来袭

    fastposter v2.18.0 一分钟完成开发海报-云服务来袭 fastposter 是一款快速开发海报的工具,已经服务众多电商.行业海报.分销系统.电商海报.电商主图等海报生成和制作场景. 什 ...

  8. JavaScript 实现前端文件下载

    A.download HTML5的A标签有一个download属性,可以告诉浏览器下载而非预览文件,很实用,参考链接:http://www.zhangxinxu.com/wordpress/2016/ ...

  9. SimpleHTTPServer模块详解

    SimpleHTTPServer实现文件的展示和下载 可以用python2.7直接启动一个进程.以命令执行的当前目录为页面根目录,如果不存在index.html,默认展示当前目录的所有文件. pyth ...

  10. 关于EF Core 更新速度随时间越来越慢的解决办法

    关于EF Core更新速度随时间越来越慢的解决办法 概要 本篇主要介绍使用 context.ChangeTracker.Clear() 方法,在通过循环进行批量更新时,通过手动清除跟踪实体以提高性能的 ...