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 相关文章推荐
JavaScript 原型与继承说明
Jun 09 Javascript
JavaScript语言核心数据类型和变量使用介绍
Aug 23 Javascript
在linux中使用包管理器安装node.js
Mar 13 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
深入理解MVC中的时间js格式化
May 19 Javascript
学习使用bootstrap的modal和carousel
Dec 09 Javascript
javascript输出AscII码扩展集中的字符方法
Dec 26 Javascript
js处理层级数据结构的方法小结
Jan 17 Javascript
jQuery自定义元素右键点击事件(实现案例)
Apr 28 jQuery
Vue3为什么这么快
Sep 23 Javascript
Element el-button 按钮组件的使用详解
Feb 01 Javascript
微信小程序实现轮播图指示器
Jun 25 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生成图形验证码几种方法小结
2013/08/15 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
JS跨域总结
2012/08/30 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
基于vue、react实现倒计时效果
2019/08/26 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
Python实现简单状态框架的方法
2015/03/19 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Python实现微信机器人的方法
2019/09/06 Python
Python如何将函数值赋给变量
2020/04/28 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
工程造价与管理专业应届生求职信
2013/11/23 职场文书
2013年军训通讯稿
2014/02/05 职场文书
网络技术专业求职信
2014/02/18 职场文书
年级组长自我鉴定
2014/02/22 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
务虚会发言材料
2014/12/25 职场文书
PHP解决高并发问题
2021/04/01 PHP
配置nginx负载均衡
2022/05/06 Servers