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 相关文章推荐
IE和Firefox的Javascript兼容性总结[推荐收藏]
Oct 19 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
May 06 Javascript
js实现超简单的展开、折叠目录代码
Aug 28 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
Jan 22 Javascript
node.js 动态执行脚本
Jun 02 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
Jun 24 Javascript
H5实现中奖记录逐行滚动切换效果
Mar 13 Javascript
AngularJS 教程及实例代码
Oct 23 Javascript
微信小程序实现多行文字超出部分省略号显示功能
Oct 23 Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 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判断文件夹是否存在不存在则创建
2015/04/09 PHP
PHP实现的简单缓存类
2015/07/29 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
javascript截取字符串小结
2015/04/28 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
详解package.json版本号规则
2019/08/01 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
Python写入数据到MP3文件中的方法
2015/07/10 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
2020/09/02 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
教育课题研究自我鉴定范文
2013/12/28 职场文书
广告学专业求职信
2014/06/19 职场文书
实习指导教师评语
2014/12/30 职场文书
刑事申诉状范文
2015/05/20 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server