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


Posted in Javascript onMarch 10, 2017

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.效果图

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

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>
Javascript 相关文章推荐
jQuery中appendTo()方法用法实例
Jan 08 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
Oct 21 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
Feb 09 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
Aug 12 Javascript
JavaScript多线程运行库Nexus.js详解
Dec 22 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
Aug 10 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
详解Vue.js中引入图片路径的几种方式
Jun 17 Javascript
localstorage实现带过期时间的缓存功能
Jun 28 Javascript
React学习之JSX与react事件实例分析
Jan 06 Javascript
ES6如何用一句代码实现函数的柯里化
Jan 18 Javascript
vue全局使用axios的操作
Sep 08 Javascript
原生javascript移动端滑动banner效果
Mar 10 #Javascript
jQuery弹出窗口简单实现代码
Mar 09 #Javascript
JavaScript实现弹窗效果代码分析
Mar 09 #Javascript
详解Vue方法与事件
Mar 09 #Javascript
Vue实现自带的过滤器实例
Mar 09 #Javascript
Vue中fragment.js使用方法详解
Mar 09 #Javascript
JavaScript编写一个贪吃蛇游戏
Mar 09 #Javascript
You might like
php自动获取目录下的模板的代码
2010/08/08 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
基于jQuery的简单九宫格实现代码
2012/08/09 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
Paypal支付不完全指北
2020/06/04 Javascript
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
最好的商品表达自己:Cafepress
2019/09/04 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
应届毕业生就业自荐信
2013/10/26 职场文书
学校募捐倡议书
2014/05/14 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
辩护词范文大全
2015/05/21 职场文书
员工给公司的建议书
2019/06/24 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python
详解 TypeScript 枚举类型
2021/11/02 Javascript
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL