用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中Iframe之间传值及子页面与父页面应用
Mar 11 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
Mar 15 Javascript
文本框文本自动补全效果示例分享
Jan 19 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
Jun 09 Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 Javascript
Javascript 运动中Offset的bug解决方案
Dec 24 Javascript
关于jQuery里prev()的简单操作代码
Oct 27 jQuery
用p5.js制作烟花特效的示例代码
Mar 21 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
微信小程序实现左滑修改、删除功能
Oct 19 Javascript
详解基于React.js和Node.js的SSR实现方案
Mar 21 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
Jul 22 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
长波有什么东西
2021/03/01 无线电
php 面向对象的一个例子
2011/04/12 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
php实现的简单日志写入函数
2015/03/31 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
HTML node相关的一些资料整理
2010/01/01 Javascript
JavaScript中实现最高效的数组乱序方法
2014/10/11 Javascript
js对象的复制继承实例
2015/01/10 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
windows下python安装小白入门教程
2018/09/18 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
数字天堂软件测试面试题
2012/12/23 面试题
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
电子商务网站的创业计划书
2014/01/05 职场文书
端午节活动策划方案
2014/03/09 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
工伤调解协议书
2016/03/21 职场文书
详解Python中的for循环
2022/04/30 Python
关于的python五子棋的算法
2022/05/02 Python