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 相关文章推荐
Js 本页面传值实现代码
May 17 Javascript
jQuery 使用手册(三)
Sep 23 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
Jun 20 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
Feb 26 Javascript
JS文本框不能输入空格验证方法
Mar 19 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
Dec 11 Javascript
JS长整型精度问题实例分析
Jan 13 Javascript
javascript操作select元素实例分析
Mar 27 Javascript
javascript实现密码验证
Nov 10 Javascript
详谈构造函数加括号与不加括号的区别
Oct 26 Javascript
js使用xml数据载体实现城市省份二级联动效果
Nov 08 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 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
晶体管单管来复再生式收音机
2021/03/02 无线电
一个高ai的分页函数和一个url函数
2006/10/09 PHP
杏林同学录(一)
2006/10/09 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
Javascript中replace()小结
2015/09/30 Javascript
通过javascript进行UTF-8编码的实现方法
2016/06/27 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
计算s=f(f(-1.4))的值
2014/05/06 面试题
一年级家长会邀请函
2014/01/25 职场文书
安全生产汇报材料
2014/02/17 职场文书
股东协议书范本
2014/04/14 职场文书
护理工作个人总结
2015/03/03 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电