jQuery插件datalist实现很好看的input下拉列表


Posted in Javascript onJuly 14, 2015

HTML5中定义了一种input框很好看的下拉列表--datalist,然而目前它的支持性并不好(万恶的IE,好在你要渐渐退役了...)。于是最近更据需求写了一个小型datalist插件,兼容到IE8(IE7应该没多少人用了吧?)。实现的具体需求如下:

      当被选中的时候(触发blur焦点)(不管是鼠标还是tab键)清空input框并且显示自定义的下拉列表,然后可以用键盘的上下键选择(鼠标当然肯定没理由不可以啦),单击鼠标左键或者enter键将选中的列表的值输入到input框。

      具体的实现代码如下:

HTML

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta name="robots" content="index, follow" />
<meta name="googlebot" content="index, follow" />
<meta name="author" content="codetker" />
  <title> 表单选中弹出框</title>
<link href="css/reset.css" type="text/css" rel="Stylesheet" /> 
<link href="css/master.css" type="text/css" rel="Stylesheet" /> 

<script type="text/javascript" src="js/jquery-1.11.0.js"></script>
</head>

<body>
  <div class="wrap">
    <form class="center">
      <div class="input_wrap">
        <input name="input1" class="input input1" type="text"/>
        <ul class="input1_ul select_list">
          <li>问题1</li>
          <li>问题2</li>
          <li>问题3</li>
          <li>问题4</li>
          <li>问题5</li>
        </ul>
      </div>
    </form>
  </div>
<script type="text/javascript" src="js/jquery.codetker.datalist.js"></script>
<script type="text/javascript">
$(document).ready(function(){
  $(".input_wrap").myDatalist({"bgcolor":"red","widths":1,"heights":1}); 
});
</script>
</body>
</html>

CSS(reset.css里面是初始化浏览器默认值用的,这里是style.css)

.wrap{ margin:0 auto; font-family: "微软雅黑";font-size: 14px;}
.center{ margin: 0 auto; width:500px;}
.input{ margin: 0; padding: 0; /*border:none;*/ width:140px; height: 24px; float:left;}
.select_list{display: none; position:absolute; z-index: 100;}
.select_list li{ height:24px; margin: 0; padding: 0; background-color: #fff; cursor: pointer; list-style: none; position:relative;}
.select_list li:hover{ background-color: red;}
.input_wrap{ position:relative; }

JavaScript

/*
  datalist 0.1 
  自定义datalist插件,实现html5中input元素datalist的效果
  兼容IE8+,Firefox,Chrome等常见浏览器
*/

;(function($,window,document,undefined){ //undefinde是真实的undefined,并非参数
  //将可选择的变量传递给方法

  //定义构造函数
  var Datalist=function(ele,opt){
    this.$element=ele;
    this.defaults={
      'bgcolor':'green',
      'widths':1,
      'heights':1
    },
    this.options=$.extend({}, this.defaults, opt);
  }
  //定义方法
  Datalist.prototype={
    showList:function(){
      var color=this.options.bgcolor;
      var width=this.options.widths;
      var height=this.options.heights; //属性值

      var obj=this.$element; //obj为最外层包裹的div之类的元素,应该拥有positive:relative属性,方便datalist定位。
      var input=$(obj).children().eq(0); //input元素
      var inputUl=$(obj).children().eq(1); //datalist元素
      //设置弹出datalist的大小和样式
      $(inputUl).css({
        "top":$(input).outerHeight()+"px",
        "width":$(input).outerWidth()*width+"px"
      });
      $(inputUl).children().css({
        "width":$(input).outerWidth()*width+"px",
        "height":$(input).outerHeight()*height+"px"
      });

      $(inputUl).children('li').mouseover(function() {
        $(this).css("background-color",color);
        $(this).siblings().css("background-color","#fff");
      });
      $(inputUl).children('li').mouseout(function() {
        $(this).css("background-color","#fff");
      });
      //再次focus变为空,也可以改为某个默认值
      //datalist的显示和隐藏
      $(input).focus(function() {
        if($(this).val()!=""){
          $(this).val("");
        }
        $(inputUl).slideDown(500);

        var n=-1; //记录位置,-1表示未选中。当n=-1时直接按enter浏览器默认为倒数第一个
        $(document).keydown(function(event) {
          /* 点击键盘上下键,datalist变化 */
          stopDefaultAndBubble(event);
          if(event.keyCode==38){//向上按钮
            if(n==0||n==-1){
              n=4;
            }else{
              n--;
            }
            $(inputUl).children('li').eq(n).siblings().mouseout();
            $(inputUl).children('li').eq(n).mouseover();
          }else if(event.keyCode==40){//向上按钮
            if(n==4){
              n=0;
            }else{
              n++;
            }
            $(inputUl).children('li').eq(n).siblings().mouseout();
            $(inputUl).children('li').eq(n).mouseover();
          }else if(event.keyCode==13){//enter键
            $(inputUl).children('li').eq(n).mouseout();
            $(input).val( $(inputUl).children('li').eq(n).text() );
            n=-1;
          }
        });


        //去掉浏览器默认
        function stopDefaultAndBubble(e){
          e=e||window.event;
          //阻止默认行为
          if (e.preventDefault) {
            e.preventDefault();
          }
          e.returnValue=false;

          //阻止冒泡
          if (e.stopPropagation) {
            e.stopPropagation();
          }
          e.cancelBubble=true;
        }

      });
      $(input).blur(function() {
        $(inputUl).slideUp(500);
      });
      $(inputUl).delegate('li', 'click', function() {
          $(input).val( $(this).text() );
      });

      return this;
    }
  }
  //在插件中使用Datalist对象
  $.fn.myDatalist=function(options){
    //创建实体
    var datalist=new Datalist(this,options);
    //调用其方法
    return datalist.showList();
  }
 
})(jQuery,window,document);

      这里用ul li列表模拟datalist options。实现逻辑非常简单,稍微需要注意点的是div.input_wrap是用相对定位的,方便ul.input1_ul相对进行定位。由于需求有很多的输入框且相互之间不影响,因此这里是input1。好歹是我自己开发的第一个插件,mark一记。

      需要代码的可以戳https://github.com/codetker/myDatalist。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 Javascript
jquery获取一个元素下面相同子元素的个数代码
Jul 31 Javascript
jqueryUI里拖拽排序示例分析
Feb 26 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
在JSP中如何实现MD5加密的方法
Nov 02 Javascript
js微信扫描二维码登录网站技术原理
Dec 01 Javascript
100行代码理解和分析vue2.0响应式架构
Mar 09 Javascript
微信小程序 sha1 实现密码加密实例详解
Jul 06 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
JS基于对象的链表实现与使用方法示例
Jan 31 Javascript
详解Vue中使用Axios拦截器
Apr 22 Javascript
JavaScript前端面试组合函数
Jun 21 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 #Javascript
jQuery实现模拟marquee标签效果
Jul 14 #Javascript
jQuery插件boxScroll实现图片轮播特效
Jul 14 #Javascript
jQuery自动添加表单项的方法
Jul 13 #Javascript
JavaScript去除数组里重复值的方法
Jul 13 #Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
Jul 13 #Javascript
jQuery检测返回值的数据类型
Jul 13 #Javascript
You might like
PHP 和 MySQL 基础教程(二)
2006/10/09 PHP
15种PHP Encoder的比较
2007/03/06 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
php 数据结构之链表队列
2017/10/17 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
深入理解Javascript中的循环优化
2013/11/09 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
javascript省市级联功能实现方法实例详解
2015/10/20 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
python判断设备是否联网的方法
2018/06/29 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
Django websocket原理及功能实现代码
2020/11/14 Python
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
优秀学生获奖感言
2014/02/15 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书