JavaScript组件开发之输入框加候选框

发布时间 - 2026-01-11 00:05:51    点击率:

1.兼容ie8 主要是事件兼容

var EventUtil = {
   on:function(elem,type,handler){
    if(elem.addEventListener){
     elem.addEventListener(type,handler,false);
    }else if(elem.attachEvent){
     elem.attachEvent("on"+type,handler);
    }
   },
   getEvent:function(event){
    return event||window.event;
   },
   getTarget:function(event){
    return event.target||event.srcElement;
   },
   getCharCode:function(event){
    if(typeof event.handler == "number"){
     return event.charCode;
    }else{
     return event.keyCode;
    }
   }
  }

2.对于候选框里面的内容使用事件代理,以及点击空白处消失

EventUtil.on(document.body,'click',function(e){
   stopPropagation(e);
   if(EventUtil.getTarget(e).nodeName=='BODY'){
    datalist.style.visibility = 'hidden';
    datalist.innerHTML ='';
   }
   if(EventUtil.getTarget(e).nodeName == "LI"){
    input.value = EventUtil.getTarget(e).innerHTML;
    datalist.style.visibility = 'hidden';
    datalist.innerHTML ='';
   }
  })

3.兼容模式下的防止冒泡

 function stopPropagation(e){
   e = window.event||e;
   if(document.all){
    e.cancelBubble = true;
   }else{
    e.stopPropagation();
   }
  }

4.效果图

 

5.完整代码

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title></title>
  <style media="screen">
   html,body{margin: 0;padding: 0;height: 100%;width: 100%;}
   input{
    width: 200px;
    border:1px solid grey;
    padding: 0 2px;
    line-height: 1.5rem;
    box-sizing: border-box;
    outline: none;
   }
   ul{
    margin:0;
    width: 200px;
    padding: 0;
    list-style: none;
    box-sizing: border-box;
    padding: 1px;
    border:1px solid;
    border-color: grey;
    visibility: hidden;
   }
   li{
    line-height: 1.5rem;
    padding: 0 0 0 1px;
   }
   li:hover{
    background-color: grey;
   }
   .section{
    top:30%;
    left:50%;
    position: absolute;
    margin-left: -100px;
   }
  </style>
 </head>
 <body>
 <div class="section">
   <input id="search"/>
   <ul id="datalist">
   </ul>
 </div>
 </body>
 <script type="text/javascript">
  var EventUtil = {
   on:function(elem,type,handler){
    if(elem.addEventListener){
     elem.addEventListener(type,handler,false);
    }else if(elem.attachEvent){
     elem.attachEvent("on"+type,handler);
    }
   },
   getEvent:function(event){
    return event||window.event;
   },
   getTarget:function(event){
    return event.target||event.srcElement;
   },
   getCharCode:function(event){
    if(typeof event.handler == "number"){
     return event.charCode;
    }else{
     return event.keyCode;
    }
   }
  }
  function stopPropagation(e){
   e = window.event||e;
   if(document.all){
    e.cancelBubble = true;
   }else{
    e.stopPropagation();
   }
  }
  var input = document.getElementById('search');
  var datalist = document.getElementById('datalist');
  var list_array = ['aa','aab','abc'];
  function generatelist(array){
   var _innerHTML = '';
   for (var i = 0; i < array.length; i++) {
    _innerHTML += '<li>'+array[i]+'</li>';
   }
   datalist.innerHTML = _innerHTML;
  }
  function findInArray(s){
   var filter_array = [];
   if(s!=''){
    for (var i = 0; i < list_array.length; i++) {
     if(list_array[i].indexOf(s)===0){
      filter_array.push(list_array[i])
     }
    }
   }
   return filter_array;
  }
  input.onkeyup = function(){
   var new_array = findInArray(this.value);
   generatelist(new_array);
   if(new_array.length>0){
    setTimeout(function(){datalist.style.visibility = 'visible';},0);
   }else{
    setTimeout(function(){datalist.style.visibility = 'hidden';},0);
   }
  }
  EventUtil.on(document.body,'click',function(e){
   stopPropagation(e);
   if(EventUtil.getTarget(e).nodeName=='BODY'){
    datalist.style.visibility = 'hidden';
    datalist.innerHTML ='';
   }
   if(EventUtil.getTarget(e).nodeName == "LI"){
    input.value = EventUtil.getTarget(e).innerHTML;
    datalist.style.visibility = 'hidden';
    datalist.innerHTML ='';
   }
  })
 </script>
</html>


# js  # 输入框加候选框  # javascript  # 输入框  # Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件  # Vue.js数字输入框组件使用方法详解  # JS 仿支付宝input文本输入框放大组件的实例  # JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金) 两位小数  # js与jquery实时监听输入框值的oninput与onpropertychange方法  # js监听输入框值的即时变化onpropertychange、oninput  # JS实现在网页中弹出一个输入框的方法  # js动态修改input输入框的type属性(实现方法解析)  # js监听input输入框值的实时变化实例  # JavaScript实现一个输入框组件  # 主要是  # 空白处  # 模式下  # visibility  # style  # datalist  # innerHTML  # LI  # hidden  # body  # document  # click 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  如何选择PHP开源工具快速搭建网站?  php结合redis实现高并发下的抢购、秒杀功能的实例  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  5种Android数据存储方式汇总  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel如何配置任务调度?(Cron Job示例)  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何快速生成专业多端适配建站电话?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何在VPS电脑上快速搭建网站?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Python图片处理进阶教程_Pillow滤镜与图像增强  音乐网站服务器如何优化API响应速度?  Laravel如何自定义分页视图?(Pagination示例)  EditPlus中的正则表达式实战(6)  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  QQ浏览器网页版登录入口 个人中心在线进入  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  如何用狗爹虚拟主机快速搭建网站?  如何挑选优质建站一级代理提升网站排名?  如何在阿里云购买域名并搭建网站?  Firefox Developer Edition开发者版本入口  进行网站优化必须要坚持的四大原则  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何快速辨别茅台真假?关键步骤解析  网易LOFTER官网链接 老福特网页版登录地址  Laravel如何使用withoutEvents方法临时禁用模型事件  如何用景安虚拟主机手机版绑定域名建站?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  奇安信“盘古石”团队突破 iOS 26.1 提权  如何快速搭建自助建站会员专属系统?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  JavaScript如何实现倒计时_时间函数如何精确控制  如何快速打造个性化非模板自助建站?  音响网站制作视频教程,隆霸音响官方网站?  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Linux网络带宽限制_tc配置实践解析【教程】