原生js实现下拉框可输入

这篇具有很好参考价值的文章主要介绍了原生js实现下拉框可输入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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实现下拉框可输入

原生js实现下拉框可输入文章来源地址https://www.toymoban.com/news/detail-711483.html

到了这里,关于原生js实现下拉框可输入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实现可输入式下拉框

    利用elementUI-plus插件,实现一个可以选择,也可以手动收入的下拉框 实现原理:select下拉框和input结合,再通过input框绝对定位到select框选择框上。传递值时两者绑定同一个值txtForm.fileName即可

    2024年02月14日
    浏览(28)
  • uni-app下拉框 可实现输入下拉框 搜索+选择组合框功能

    插件示例地址

    2024年02月11日
    浏览(40)
  • react + antd:AutoComplete 实现既可以自由输入又能下拉选择

    在工作中遇到一个需求,既能下拉选择,有要求可以自由输入没有的选项。 刚开始考虑使用 Select 组件,发现只有多选( mode=\\\"tags\\\" )的时候才能随意输入内容,但多选又不符合当前的业务需求。 在犹豫要不要自定义一个组件来实现业务需求时,发现了 AutoComplete 组件,完美实

    2024年01月19日
    浏览(76)
  • 原生JS实现视频截图

    要用原生js实现视频截图,可以利用 canvas 的绘图功能 ctx.drawImage ,只需要获取到视频标签,就可以通过 drawImage 把视频当前帧图像绘制在canvas画布上。 接下来,需要把画布转化为图片,canvas提供了两个2D转换为图片的方法: canvas.toDataURL() 和 canvas.toBlob() canvas.toDataURL(mimeType,

    2024年02月05日
    浏览(33)
  • WebSocket原生js实现

    WebSocket 是一种网络通信协议。 1. 简单介绍一下HTTP协议 ​ HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。 通信请求只能由客户端发起,服务端对请求做出应答处理 。 这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消

    2023年04月26日
    浏览(30)
  • 原生JS实现图片裁剪功能

    功能介绍:图片通过原生input上传,使用canvas进行图片裁剪。 裁剪框限制不允许超出图片范围,图片限制了最大宽高(自行修改要的尺寸),点击确认获取新的base64图片数据 注:fixed布局不适用该方案,若是fixed布局请查看另一篇文章 效果图: 上代码

    2024年02月11日
    浏览(35)
  • 原生js实现拖拽效果

    2024年01月16日
    浏览(29)
  • 原生 JS 实现一个简单轮播图

    在动手实现轮播图之前,我们先来明确一下要实现的效果。 默认自动轮播,每隔4秒切换一张图片 鼠标点击任一个小圆点即可切换到对应的图片 鼠标移入轮播区域时,两侧出现切换图片的按钮,点击按钮分别切换到上(下)一张图片 因此,轮播图可以分为三个主要部分,首

    2024年02月09日
    浏览(46)
  • 原生js实现锚点滚动顶部

    使用原生js API实现滚动到指定容器的顶部,API是 scrollIntoView let el=docment.querySelector() 获取dom元素 el.scrollIntoView()该元素滚动到其父元素的顶部 完整用法可以去MDN点我查看

    2024年02月15日
    浏览(24)
  • 【综合案例】原生JS实现购物商城

    资料链接和启动方法:https://pan.baidu.com/s/1Ka2xcPmsL31MpQhqNnZlCw 提取码:1115 1、目录结构 2、conf文件夹 3、用户名密码的正则和ajax的封装 1、案例效果 2、登录页逻辑 采集用户信息     —点击登录时 验证信息 非空验证 正则校验 把用户名和密码发送给后端 — 根据后端返回结果

    2024年02月08日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包