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代码
Dec 03 Javascript
javascript学习笔记(三)BOM和DOM详解
Sep 30 Javascript
jQuery学习笔记之Ajax用法实例详解
Dec 01 Javascript
jquery表单验证插件formValidator使用方法
Apr 01 Javascript
angular使用bootstrap方法手动启动的实例代码
Jul 18 Javascript
JS鼠标3次点击事件实现代码及扩展思路
Sep 12 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
Jan 08 Javascript
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 Javascript
通过js给网页加上水印背景实例
Jun 17 Javascript
element form 校验数组每一项实例代码
Oct 10 Javascript
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
原生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 遍历XP文件夹下所有文件
2008/11/27 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
JavaScript 乱码问题
2009/08/06 Javascript
读jQuery之三(构建选择器)
2011/06/11 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
Python中函数的用法实例教程
2014/09/08 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
Python之用户输入的实例
2018/06/22 Python
Selenium定位元素操作示例
2018/08/10 Python
Python面向对象进阶学习
2019/05/21 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
详解python 中in 的 用法
2019/12/12 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
工程管理专业个人求职信范文
2013/12/07 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python