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 中文参数乱码解决方案
Nov 09 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
Mar 20 Javascript
javascript闭包的高级使用方法实例
Jul 04 Javascript
js获取本机的外网/广域网ip地址完整源码
Aug 12 Javascript
jQuery和AngularJS的区别浅析
Jan 29 Javascript
javascript中错误使用var造成undefined
Mar 31 Javascript
纯JS实现可拖拽表单的简单实例
Sep 02 Javascript
jquery判断页面网址是否有效的两种方法
Dec 11 Javascript
Vue的事件响应式进度条组件实例详解
Feb 04 Javascript
vue组件之间数据传递的方法实例分析
Feb 12 Javascript
Node.js Domain 模块实例详解
Mar 18 Javascript
微信小程序实现聊天室功能
Jun 14 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/06/06 PHP
php实现httpclient类示例
2014/04/08 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
容易被忽略的JS脚本特性
2011/09/13 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
jstree的简单实例
2016/12/01 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
Python实现注册登录系统
2017/08/08 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
使用K.function()调试keras操作
2020/06/17 Python
超级实用的8个Python列表技巧
2020/08/24 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
校园广播稿500字
2014/02/04 职场文书
信息技术课后反思
2014/04/27 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
运动员入场词
2015/07/18 职场文书
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技