用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 相关文章推荐
解析jquery中的ajax缓存问题
Dec 19 Javascript
返回上一页并自动刷新的JavaScript代码
Feb 19 Javascript
JavaScript中的typeof操作符用法实例
Apr 05 Javascript
js键盘事件的keyCode
Jul 29 Javascript
javascript数组去重方法汇总
Apr 23 Javascript
jQuery实现的多级下拉菜单效果代码
Aug 24 Javascript
Jquery组件easyUi实现表单验证示例
Aug 23 Javascript
通过jquery实现页面的动画效果(实例代码)
Sep 18 Javascript
bootstrap3-dialog-master模态框使用详解
Aug 22 Javascript
详解Vue快速零配置的打包工具——parcel
Jan 16 Javascript
jQuery阻止事件冒泡实例分析
Jul 03 jQuery
React实现评论的添加和删除
Oct 20 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的SQL注入过程分析
2012/01/06 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
asp 取文本框名称代码
2008/12/02 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
python pandas 时间日期的处理实现
2019/07/30 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
python打包多类型文件的操作方法
2020/09/21 Python
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
英国探险旅游专家:Explore
2018/12/20 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
推普周活动总结
2014/08/28 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
母亲去世追悼词
2015/06/23 职场文书
教研活动主持词
2015/07/03 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js