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 相关文章推荐
prototype 源码中文说明之 prototype.js
Sep 22 Javascript
jQuery让控件左右移动的三种实现方法
Sep 08 Javascript
JavaScript实现多种排序算法
Feb 24 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
Jul 31 Javascript
js实现登录与注册界面
Nov 01 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
Vue使用NPM方式搭建项目
Oct 25 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 Javascript
vue resource发送请求的几种方式
Sep 30 Javascript
JavaScript中数组去重的5种方法
Jul 04 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 程式大小
2006/12/06 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
js select option对象小结
2013/12/20 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
jquery实现拖动效果
2016/08/10 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
浅谈React高阶组件
2018/03/28 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
python3使用urllib模块制作网络爬虫
2016/04/08 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
关于Python数据结构中字典的心得
2017/12/04 Python
python3 flask实现文件上传功能
2020/03/20 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
应用电子技术专业个人求职信
2013/09/21 职场文书
1亿有多大教学反思
2014/05/01 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书