用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 广告后加载,加载完页面再加载广告
Nov 25 Javascript
基于jquery的一个拖拽到指定区域内的效果
Sep 21 Javascript
基于JavaScript实现生成名片、链接等二维码
Sep 20 Javascript
JS控制按钮10秒钟后可用的方法
Dec 22 Javascript
jQuery动态加载css文件实现方法
Jun 15 Javascript
jquery加载单文件vue组件的方法
Jun 20 jQuery
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
Vue-不允许嵌套式的渲染方法
Sep 13 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
Apr 17 Javascript
Vue+Element实现网页版个人简历系统(推荐)
Dec 31 Javascript
使用vuex-persistedstate本地存储vuex
Apr 29 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
长波有什么东西
2021/03/01 无线电
PHP中的串行化变量和序列化对象
2006/09/05 PHP
第十二节 类的自动加载 [12]
2006/10/09 PHP
php FPDF类库应用实现代码
2009/03/20 PHP
探讨如何在PHP开启gzip页面压缩实例
2013/06/09 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
thinkphp5.1框架容器与依赖注入实例分析
2019/07/23 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
jquery延迟对象解析
2016/10/26 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
js作用域和作用域链及预解析
2019/04/11 Javascript
详细介绍Python函数中的默认参数
2015/03/30 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
详解python datetime模块
2020/08/17 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
学校先进集体事迹材料
2014/05/31 职场文书
垃圾桶标语
2014/06/24 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
小学新教师个人总结
2015/02/05 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
校园安全教育心得体会
2016/01/15 职场文书