用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实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
JS 图片缩放效果代码
Jun 09 Javascript
jquery利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
JS实现一键回顶功能示例代码
Oct 28 Javascript
javaScript事件机制兼容【详细整理】
Jul 23 Javascript
Bootstrap选项卡动态切换效果
Nov 28 Javascript
HTML5+jQuery实现搜索智能匹配功能
Mar 24 jQuery
关于Angular2 + node接口调试的解决方案
May 28 Javascript
解析vue中的$mount
Dec 21 Javascript
Vue创建头部组件示例代码详解
Oct 23 Javascript
微信小程序与后台PHP交互的方法实例分析
Dec 10 Javascript
JavaScript实现网页计算器功能
Oct 29 Javascript
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
php自定义函数截取汉字长度
2014/05/15 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
Python线程创建和终止实例代码
2018/01/20 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
python 字符串只保留汉字的方法
2018/11/16 Python
Python 加密与解密小结
2018/12/06 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
财务会计应届生求职信
2013/11/24 职场文书
天鹅的故事教学反思
2014/02/04 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
2015年科普工作总结
2015/07/23 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
springcloud整合seata
2022/05/20 Java/Android