JQuery SELECT单选模拟jQuery.select.js


Posted in Javascript onNovember 12, 2009

基于jQuery JavaScript Library v1.3.2 的单选模拟
(本文件是跟据 zhangjingwei 的Jquery Select(单选) 模拟插件 V1.3.4 修改而来的)
a. 修改的主要原因是,原来的zhangjingwei的模拟在显示方式上的问题。在跟文字交替出现时会出现错位。现将模拟DIV的display修改为inline方式。更自然的嵌入到文本行中。
b.在加载文件后自动转化样式名为'commonselect' 的select。简化调用
c.对select的onchange()事件的响应。以及宽度获取的小调整
jquery.select.js

/* 
* jQuery.select.js 
*/ 
jQuery.fn.sSelect = function(){ 
    var selectId = $(this).attr('id'); 
    var selectZindex = $(this).css('z-index'); 
    var selectIndex = $('#'+selectId+' > select > option').index($('#'+selectId+' > select > option:selected')[0]); 
    $('#'+selectId).append('<div class="dropselectbox"><h4></h4><span class="FixSelectBrowserSpan"></span><ul style="display:none" style="display:none"><li></li></ul></div>'); 
    $('#'+selectId+' > div > h4').empty().append($('#'+selectId+' > select > option:selected').text()); 
    $('.dropselectbox').css("display", 'block');     //取select的宽度 优先级 select样式中的宽度 - select自动的宽度 - 默认为60 
    var selectcssWidth = $('#'+selectId+'> select').css('width'); 
    selectcssWidth = typeof(selectcssWidth) =='undefined' ? 0 : parseInt(selectcssWidth.replace('px','')) +5 ; 
    var selectWidth = selectcssWidth ? selectcssWidth : ( $('#'+selectId+'> select').width() > 0 ? $('#'+selectId+'> select').width() + 5 : 60); 
    $('#'+selectId).css("margin-right",selectWidth);    //修改偏移量 
    $('#'+selectId+' > div > h4').css("width", selectWidth); //将原select的宽度赋值给生成的select(并不是h4的总宽度) 
    $('#'+selectId+' > div > ul').css("width",selectWidth); //将h4的总宽度赋值给Ul 
    $('#'+selectId+' > select').hide(); 
    $('#'+selectId+' > div').hover(function(){ 
        $('#'+selectId+' > div > h4').addClass("over"); 
        $('#'+selectId+' > div > span').addClass("over"); 
    },function(){ 
        $('#'+selectId+' > div > h4').removeClass("over"); 
        $('#'+selectId+' > div > span').removeClass("over"); 
    }); 
    $('#'+selectId) 
    .bind("focus",function(){ 
        __clearSelectMenu(); 
        $('#'+selectId+' > div > h4').addClass("over"); 
        $('#'+selectId+' > div > span').addClass("over"); 
    }) 
    .bind("click",function(e){ 
        //$('#value2').append('点击:'+selectIndex+'  <br>'); 
        if($('#'+selectId+' > div > ul').css("display") == 'block'){ 
            __clearSelectMenu(selectId); 
            return false; 
        }else{ 
            if ($.browser.opera){__clearSelectMenu();} 
            $('#'+selectId+' > div > h4').addClass("current"); 
            $('#'+selectId+' > div > span').addClass("over").addClass("current"); 
            $('#'+selectId+' > div > ul').show(); 
            var selectZindex = $(this).css('z-index'); 
            if ($.browser.msie || $.browser.opera){         
                $('.dropdown').removeClass('overclass');         
            } 
            $('#'+selectId).addClass('overclass'); 
            __setSelectValue(selectId); 
            var windowspace = ($(window).scrollTop() + document.documentElement.clientHeight) - $(this).offset().top; 
            var ulspace = $('#'+selectId+' > div > ul').outerHeight(true); 
            var windowspace2 = $(this).offset().top - $(window).scrollTop() - ulspace; 
            if (windowspace < ulspace && windowspace2 > 0) { 
                $('#'+selectId+' > div > ul').css({top:-ulspace}); 
            }else{ 
                $('#'+selectId+' > div > ul').css({top:$('#'+selectId+' > div > h4').outerHeight(true)}); 
            } 
            selectIndex = $('#'+selectId+' > div > ul > li').index($('.selectedli')[0]); 
            $(window).scroll(function(){ 
                var windowspace = ($(window).scrollTop() + document.documentElement.clientHeight) - $('#'+selectId).offset().top; 
                var ulspace = $('#'+selectId+' > div > ul').outerHeight(true); 
                if (windowspace < ulspace) { 
                    $('#'+selectId+' > div > ul').css({top:-ulspace}); 
                }else{ 
                    $('#'+selectId+' > div > ul').css({top:$('#'+selectId+' > div > h4').outerHeight(true)}); 
                } 
            }); 
            //响应鼠标点击选择 
            $('#'+selectId+' > div > ul > li').click(function(e){                                         
                    selectIndex = $('#'+selectId+' > div > ul > li').index(this); 
                    //$('#value2').append('鼠标点击:'+selectIndex+'  <br>'); 
                    $('#'+selectId+'> select')[0].selectedIndex = selectIndex; 
                    $('#'+selectId+' > div > h4').empty().append($('#'+selectId+' > select > option:selected').text()); 
                    __clearSelectMenu(selectId,selectZindex); 
                    e.stopPropagation(); 
                    e.cancelbubble = true; 
                    //SELECT onchange 事件 
                    $('#'+selectId+'> select').change(); 
            }) 
            .hover( 
                 function(){ 
                        $('#'+selectId+' > div > ul > li').removeClass("over"); 
                        $(this).addClass("over").addClass("selectedli"); 
                        selectIndex = $('#'+selectId+' > div > ul > li').index(this); 
                    }, 
                    function(){ 
                        $(this).removeClass("over"); 
                    } 
            ); 
            //End 
        }; 
        e.stopPropagation(); 
    }) 
    .bind("mousewheel",function(){ 
        //以后也许支持滚轮     
        /*$('#'+selectId+' > div > ul > li').hover( 
            function(){ 
             return false; 
            }, 
            function(){ 
                return false; 
            } 
        );*/ 
    }) 
    .bind("dblclick", function(){ 
        __clearSelectMenu(); 
        return false; 
    }) 
    .bind("keydown",function(e){ 
        //var hotkeys = e.keyCode; 
        $(this).bind('keydown',function(e){ 
            if (e.keyCode == 40 || e.keyCode == 38 || e.keyCode == 35 || e.keyCode == 36){ 
                return false; 
            } 
        }); 
        switch(e.keyCode){ //设置为true可给定case范围 
            case 9: 
                return true; 
                break; 
            case 13: 
                //enter 
                //$('#value2').append('按回车收到的值:'+selectIndex+'  <br>'); 
                __clearSelectMenu(); 
                break; 
            case 27: 
                //esc 
                __clearSelectMenu(); 
                break; 
            case 33: 
                $('#'+selectId+' > div > ul > li').removeClass("over"); 
                selectIndex = 0; 
                __keyDown(selectId,selectIndex); 
                break; 
            case 34: 
                $('#'+selectId+' > div > ul > li').removeClass("over"); 
                selectIndex = ($('#'+selectId+' > select > option').length - 1); 
                __keyDown(selectId,selectIndex); 
                break; 
            case 35: 
                $('#'+selectId+' > div > ul > li').removeClass("over"); 
                selectIndex = ($('#'+selectId+' > select > option').length - 1); 
                __keyDown(selectId,selectIndex); 
                break; 
            case 36: 
                $('#'+selectId+' > div > ul > li').removeClass("over"); 
                selectIndex = 0; 
                __keyDown(selectId,selectIndex); 
                break; 
            case 38: 
                //up 
                //$('#value2').append('原始值:'+selectIndex+'  <br>'); 
                $('#'+selectId+' > div > ul > li').removeClass("over"); 
                if (selectIndex == 0){ 
                    selectIndex = 0; 
                }else{ 
                    selectIndex--; 
                }; 
                //$('#value2').append('<span style="color:red;" style="color:red;">向上改变的aa值:</span>'+selectIndex+'  '); 
                __keyDown(selectId,selectIndex); 
                break; 
            case 40: 
                //down 
                //$('#value2').append('传递过来的:'+selectIndex+'  '); 
                $('#'+selectId+' > div > ul > li').removeClass("over"); 
                if (selectIndex == ($('#'+selectId+' > select > option').length - 1)){ 
                    selectIndex = $('#'+selectId+' > select > option').length - 1; 
                }else{ 
                    selectIndex ++; 
                }; 
                //$('#value2').append('<span style="color:blue;" style="color:blue;">向下改变的aa值:</span>'+selectIndex+'  '); 
                __keyDown(selectId,selectIndex); 
                break; 
            /*case ((hotkeys > 47 && hotkeys < 59) || (hotkeys > 64 && hotkeys < 91) || (hotkeys > 96 && hotkeys < 123)): 
                //首字幕查询预留接口 
                //character = String.fromCharCode(hotkeys).toLowerCase(); 
                return false; 
                break;*/ 
            default: 
                return false; 
                break; 
        }; 
    }) 
    .bind("blur",function(){ 
        __clearSelectMenu(selectId,selectZindex); 
        return false; 
    }); 
    //禁止选择 
    $('.dropselectbox').bind("selectstart",function(){ 
            return false; 
    }); 
}; 
function __clearSelectMenu(selectId,selectZindex){ 
    //$('#value2').append('移除焦点:'+selectIndex+'  <br>'); 
    $('.dropselectbox > ul').empty().hide(); 
    $('.dropselectbox > h4').removeClass("over").removeClass("current"); 
    $('.dropselectbox > span').removeClass("over"); 
    $('#'+selectId).removeClass('overclass'); 
} 
function __setSelectValue(sID){ 
    $('#'+sID+' > div > ul').empty(); 
    $.each($('#'+sID+' > select > option'), function(i){ 
        $('#'+sID+' > div > ul').append("<li class='FixSelectBrowser'>"+$(this).text()+"</li>"); 
    }); 
    $('#'+sID+' > div > h4').empty().append($('#'+sID+' > select option:selected').text()); 
    $('#'+sID+' > div > ul > li').eq($('#'+sID+'> select')[0].selectedIndex).addClass("over").addClass("selectedli"); 
} 
function __keyDown(sID,selectIndex){ 
    $('#'+sID+'> select')[0].selectedIndex = selectIndex; 
    $('#'+sID+' > div > ul > li:eq('+selectIndex+')').toggleClass("over"); 
    $('#'+sID+' > div > h4').empty().append($('#'+sID+' > select option:selected').text()); 
    //SELECT onchange 事件 
    $('#'+sID+'> select').change(); 
} 
/* 自动调用 */ 
$(document).ready(function(){ 
    var s = new Array(); 
    var t = document.getElementsByTagName('select'); 
    var j = 0; 
    for(var i=0;i<t.length;i++){ 
        if(t[i].className=='commonselect'){ 
            s[j] = t[i]; 
            j++; 
        } 
    } 
    if(j==0)return; 
    var k = m = null; 
    for(var i=0;i<s.length;i++){ 
        k = s[i].parentNode; 
        m = createDiv(k, i); 
        //s[i].replaceNode(m); 
        k.replaceChild(m,s[i]) 
        m.appendChild(s[i]); 
        $('#selectbox'+ i).sSelect(); 
    }     
    function createDiv(p, i){ 
        var div = document.createElement('div'); 
        div.className = 'dropdown'; 
        div.id = 'selectbox' + i; 
        div.innerHTML = ' '; 
        p.appendChild(div); 
        return div;     
    } 
})

HTML应用
<!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=utf-8" /> 
<title>JQuery SELECT单选模拟</title> 
<style type="text/css" bogus="1"> 
body,div,ul,h4,li {margin:0; padding:0; border:none; list-style:none; font-size:1;} 
/*下拉列表select的commonselect样式 配合jquery.select插件 */ 
/* select style */ 
.dropdown {outline:none;z-index:1;display:inline-block;*display:inline; position:relative;} 
.dropdown * {-moz-user-select:none;} 
.dropselectbox{float:left; position:absolute} 
.overclass{ z-index:999} /* 对于IE下层定位问题的修正样式 */ 
.dropdown h4{position:relative;cursor:default; text-indent:5px;text-align:left;display:block;overflow:visible; margin:0; height:20px;font:12px/21px Arial, Helvetica, sans-serif; border:solid 1px #AAA; background:#3B3936 ;color:#CEBC7E;padding-left:0px;} 
.dropdown h4.over{border-color:#369;} 
.dropdown h4.current{border-color:#003;} 
.dropdown div {display:none;position:absolute; left:0px; top:0px;} 
.dropdown span {position:absolute;top:4px; right:3px; background:url(ico.gif) no-repeat center; width:16px; height:14px;} 
.dropdown ul{position:absolute;display:none;border:1px solid #AAA; background:#333;color:#8E867B;} 
.dropdown ul li{text-indent:5px;background:#333;height:19px;display:block;cursor:default;font:400 12px/19px Arial, Helvetica, sans-serif;text-align:left;} 
.dropdown ul li.over{background:#369; color:#FFF;} 
/* select style */ 
/* input style */ 
input.txt{border:solid 1px #AAA; background:#3B3936 ;color:#CEBC7E; height:18px;line-height:18px;} 
</style> 
<script type="text/javascript" src="jquery132.js" src="jquery132.js"></script> 
<script type="text/javascript" src="jquery.select.js" src="jquery.select.js"></script> 
</head> 
<body style="background:none" style="background:none"> 
    <h1>Jquery Select(单选) 模拟插件 V1.3.4</h1> 
    <form action="#" method="post" style="margin:10px;" style="margin:10px;"> 
    类型: 
    <select name="type" class="commonselect" id="test"> 
                <option value=""></option> 
                <option value="男">类型男</option> 
                <option value="女">类型女</option> 
        </select> 
    性别: 
     <select name="sex" style="width:100px" onchange="alert(this.value);"> 
                <option value="">性别:</option> 
                <option value="男">男</option> 
                <option value="女">女</option> 
        </select> 
    <input type="text" size="8" class="txt" name='input'> 
    <input type="submit" id="postform" value="提交表单" style="border:1px solid #000; height:23px; margin-left:20px;" /> 
    </form> 
</body> 
</html>

可以参考这篇文档https://3water.com/jiaoben/21397.html
Javascript 相关文章推荐
如何用js控制css中的float的代码
Aug 16 Javascript
js GridView 实现自动计算操作代码
Mar 25 Javascript
Javascript Jquery 遍历Json的实现代码
Mar 31 Javascript
jquery 年会抽奖程序
Dec 22 Javascript
完美解决AJAX跨域问题
Nov 01 Javascript
简单方法判断JavaScript对象为null或者属性为空
Sep 26 Javascript
easyui combobox开启搜索自动完成功能的实例代码
Nov 08 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
Dec 14 Javascript
jQuery实现动态文字搜索功能
Jan 05 Javascript
jQuery实现鼠标经过显示动画边框特效
Mar 24 jQuery
karma+webpack搭建vue单元测试环境的方法示例
May 24 Javascript
node 解析图片二维码的内容代码实例
Sep 11 Javascript
Jquery操作Select 简单方便 一个js插件搞定
Nov 12 #Javascript
jquery控制listbox中项的移动并排序
Nov 12 #Javascript
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
Nov 12 #Javascript
两个select之间option的互相添加操作(jquery实现)
Nov 12 #Javascript
XHTML下,JS浮动代码失效的问题
Nov 12 #Javascript
把html页面的部分内容保存成新的html文件的jquery代码
Nov 12 #Javascript
Javascript 定时器调用传递参数的方法
Nov 12 #Javascript
You might like
PHP生成带有雪花背景的验证码
2008/09/28 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
Node.js简单入门前传
2017/08/21 Javascript
nodejs使用express获取get和post传值及session验证的方法
2017/11/09 NodeJs
vue中倒计时组件的实例代码
2018/07/06 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
Linux下Python获取IP地址的代码
2014/11/30 Python
Python最基本的输入输出详解
2015/04/25 Python
python 调用c语言函数的方法
2017/09/29 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
为什么要用EJB
2014/04/17 面试题
高中军训感言800字
2014/03/05 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
协议书范本
2014/04/23 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
2015年党员个人剖析材料
2014/12/18 职场文书
员工工作表现自我评价
2015/03/06 职场文书
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers