用jQuery模拟select下拉框的简单示例代码


Posted in Javascript onJanuary 26, 2014

很多时候,美工会觉得默认的select下拉框很难看(特别是右侧的下拉箭头按钮),他们通常喜欢用一个自定义的图标来代替这个按钮。这样就只能用 js + div 来模拟了,倒腾了一番,用jQuery模拟了下,当然网上这种文章也不少,只是懒得去看找

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>自己实现的下拉框</title>
    <style type="text/css" media="all">
        *{font-size:12px;line-height:18px;list-style:none;padding:0;margin:0;text-decoration:none;color:#000;border:0}
        .page{text-align:center;margin:50px;}
        input{border-bottom:solid 1px #ccc;height:18px}              
        .expand{display:none;position:absolute;width:200px;height:100px;overflow-y:auto;border:solid 1px #ccc};
  .expand li{margin:1px 0;background:#fff}
        .expand a{text-decoration:none;display:block;padding:0 5px;background:#efefef;margin:1px 0}
        .expand a:hover{background:#ff9}
    </style>
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.min.js"></script>
    <script type="text/javascript">
        function showExpand(targetId, expandId, expand_class) {
            //先关掉其它弹出的层
            if (expand_class != undefined) {
                $("." + expand_class).hide();
            }
            //判断是否为IE
            var isIE = (! +[1, ]);
            var expand = $("#" + expandId);
            var target = $("#" + targetId);
            var dx = 0;
            if (isIE) {
                dx = -2;
            }
            else {
                dx = 0;
            }
            expand.get(0).style.left = target.get(0).getBoundingClientRect().left + dx + "px";
            if (isIE) {
                dx = 17;
            }
            else {
                dx = 19;
            }
            expand.get(0).style.top = parseInt(target.get(0).getBoundingClientRect().top) + dx + "px";
            expand.show();
            //每个li点击时赋值
            $("#" + expandId).find("li").each(function (i) {
                $(this).show().click(function () {
                    target.val($(this).text().split(' ')[1]);
                    expand.hide();
                })
            })
    
        }
  
        function search(srcId, expandId) {
            var expand = $("#" + expandId);
            var src = $("#" + srcId);
            var A = expand.find("a");
            var v = src.val().toUpperCase();
            A.each(function (i) {
                if (v.length >= 2) {
                    if ($(this).text().toUpperCase().indexOf(v) == -1) {
                        $(this).parent().hide();
                    }
                    else {
                        $(this).parent().show();
                    }
                }
                if (v.length <= 0) {
                    $(this).parent().show();
                }
            })
            src.val(v);
        }

  $().ready(function(){
   $("#txt_city").keyup(function(){
    search('txt_city','city_select1');
   }).focus(function(){
    showExpand('txt_city','city_select1','expand')
   })
   $("#txt_city2").keyup(function(){
    search('txt_city2','city_select2');
   }).focus(function(){
    showExpand('txt_city2','city_select2','expand')
   })
  })
  function fnTest(){
   document.getElementById("txtTarget").value = document.getElementById("txtSrc").value;
  }
    </script>
</head>
<body>
    <div class="page" style="text-align: center">
        <input type="text" value="" id="txt_city" class="input_expand"  /><a
            href="#" onclick="showExpand('txt_city','city_select1','expand')">?</a>
        <div class="expand" id="city_select1">
            <ul>
                <li><a href="javascript:void(0)">SH 上海</a></li>
                <li><a href="javascript:void(0)">BJ 北京</a></li>
                <li><a href="javascript:void(0)">HZ 杭州</a></li>
                <li><a href="javascript:void(0)">WH 武汉</a></li>
                <li><a href="javascript:void(0)">NJ 南京</a></li>
                <li><a href="javascript:void(0)">WX 无锡</a></li>
            </ul>
        </div>
        <input type="text" value="" id="txt_city2" class="input_expand"  /><a
            href="#" onclick="showExpand('txt_city2','city_select2','expand')">?</a>
        <div class="expand" id="city_select2">
            <ul>
                <li><a href="javascript:void(0)">CN 中文</a></li>
                <li><a href="javascript:void(0)">EN 英语</a></li>
                <li><a href="javascript:void(0)">JP 日本</a></li>
                <li><a href="javascript:void(0)">RA 俄语</a></li>
                <li><a href="javascript:void(0)">FA 法语</a></li>
                <li><a href="javascript:void(0)">00 其它</a></li>
            </ul>
        </div>
  <br/>
  <br/>
  <input type="text" id="txtSrc" onkeyup="fnTest()" />
  <br/>
  <input type="text" id="txtTarget" />
    </div>
</body>
</html>

无图无真相,真相在此:
用jQuery模拟select下拉框的简单示例代码
不足之处:
1、按键盘上下键时,没有高亮的自动移动
2、键入文字自动过滤结果时,感觉相对原生的select有些不自然
Javascript 相关文章推荐
在JavaScript中构建ArrayList示例代码
Sep 17 Javascript
jQuery中appendTo()方法用法实例
Jan 08 Javascript
javascript实现验证IP地址等相关信息代码
May 10 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
Oct 28 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
May 05 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
Aug 01 Javascript
js中遍历Map对象的简单实例
Aug 08 Javascript
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
angularjs请求数据的方法示例
Aug 06 Javascript
如何在JavaScript中创建具有多个空格的字符串?
Feb 23 Javascript
vue使用微信扫一扫功能的实现代码
Apr 11 Javascript
vue3.0+vue-router+element-plus初实践
Dec 02 Vue.js
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
Jan 26 #Javascript
javascript:json数据的页面绑定示例代码
Jan 26 #Javascript
jQuery focus和blur事件的应用详解
Jan 26 #Javascript
当jQuery1.7遇上focus方法的问题
Jan 26 #Javascript
jQuery中delegate和on的用法与区别详细解析
Jan 26 #Javascript
使用javascript为网页增加夜间模式
Jan 26 #Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
Jan 26 #Javascript
You might like
模仿OSO的论坛(四)
2006/10/09 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
php生成圆角图片的方法
2015/04/07 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
javascript自启动函数的问题探讨
2013/10/05 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
javascript 判断用户有没有操作页面
2017/10/17 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
如何在python中执行另一个py文件
2020/04/30 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
秋季校运动会广播稿
2014/02/23 职场文书
班训口号大全
2014/06/18 职场文书
公司踏青活动方案
2014/08/16 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
Python利用folium实现地图可视化
2021/05/23 Python
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python