用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 相关文章推荐
JS获取页面窗口大小的代码解读
Dec 01 Javascript
AngularJs 60分钟入门基础教程
Apr 03 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
Jul 06 Javascript
jquery获取链接地址和跳转详解(推荐)
Aug 15 jQuery
JS中Attr的用法详解
Oct 09 Javascript
Vue 实现树形视图数据功能
May 07 Javascript
JS实现键值对遍历json数组功能示例
May 30 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
Aug 19 Javascript
Vue中使用vux配置代码详解
Sep 16 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 Javascript
js仿360开机效果
Dec 26 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 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伪静态写法附代码
2008/06/20 PHP
又一个php 分页类实现代码
2009/12/03 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Python内置函数的用法实例教程
2014/09/08 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
Python中集合类型(set)学习小结
2015/01/28 Python
Python多线程爬虫简单示例
2016/03/04 Python
10个Python小技巧你值得拥有
2018/09/29 Python
python实现的分层随机抽样案例
2020/02/25 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
餐厅销售主管职责范本
2014/02/19 职场文书
监察建议书范文
2014/03/12 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
外贸采购员岗位职责
2015/04/03 职场文书