基于jquery扩展漂亮的下拉框——ComboBox

继续发一篇关于web前端自定义控件——ComboBox(下拉框),以往我在使用下拉框控件老是为了样式丑陋而烦恼,现在分享这个控件,希望有用的同仁们可以收藏,或进行二次修改,达到你想要的效果。

分解自定义下拉框:

1。创建构造函数,初始化赋值控件值。

2。绑定控件呈现在前台。

3。点击下拉框控件,展示下拉列表

4。点击触发下拉框控件,收起下拉列表。

5。点击下拉项触发事件。


代码如下:

Html代码:

<b class="select_type"></b>

css样式:

.dropdown span a{float:left;background:url(/img/Icon_BG.png);}
/*下拉框 http://power.76741.com*/
.dropdown span a{background-position: -213px -75px;}
.dropdown{float:left;width:105px;}
.dropdown span{border:solid 1px #ccc;width:95%;height:28px;background:url(/img/tbline_bg.png);border-radius:8px;overflow:hidden;}
.dropdown span{float:left;padding-left:10px;line-height:28px; cursor:pointer;}
.dropdown span.active{border-radius:8px 8px 0px 0px;}
.dropdown span font{width:auto;margin-right: 0px;float:left;}
.dropdown span a{float:right;width:20px;height:20px;margin:4px 0;}
.dropdown p{border:solid 1px #ccc;border-top:0px;width:103px;display:none;position:absolute;margin-top:28px;background-color:#fff;z-index:3;max-height:280px;overflow-y: auto; overflow-x: hidden;}
.dropdown p a{float:left;line-height:28px;height:28px;padding-left:10px;color:#666;font-size:14px;cursor:default;text-align:left;width:100%;overflow:hidden;}
.dropdown p a:hover{background:url(/img/tbline_bg.png);color:#666;}

Js代码:

1。自定义类:

//下拉框
var ComboBox = function () {
    this.tag;
    this.data_default;
    this.data_list;
    this.index = 0;

    var _this = this;
    var _index, _tag, _value;
    //初始化
    this.init = function () {
        _tag = _this.tag;
        _index = _this.index;
        //设置对象
        _this.setDropdown(_this.data_default, _this.data_list);
        //赋值绑定事件
        if (_tag.find('span font').length > 0) _value = _tag.find('span font').attr('_id');
        if (_tag == undefined) { return false; }
        _this.showEvent();
        _this.selectedIndex(_index);
        return true;
    }
    //设置下拉列表
    this.setDropdown = function (default_data, list) {
        var css = _tag.attr('class');
        if (default_data == undefined) {
            default_data = { id: 'null', name: '' };
        }
        var _html = '';
        if (_tag.find('p').length > 0 && _tag.find('span').length > 0) {
            $.each(list, function (i, value) {
                _html += '<a _id="' + value.id + '">' + value.name + '</a>';
            });
            _tag.find('span font').replaceWith('<font _id="' + default_data.id + '">' + default_data.name + '</font>');
            _tag.find('p').html(_html);
        } else {
            _html = '<div class="dropdown ' + css + '">';
            _html += '<span><font _id="' + default_data.id + '">' + default_data.name + '</font><a></a></span>';
            _html += '<p>';
            if (list) {
                $.each(list, function (i, value) {
                    _html += '<a _id="' + value.id + '">' + value.name + '</a>';
                });
            }
            _html += '</p>';
            _html += '</div>';
            var parent = _tag.parent();
            _tag.replaceWith(_html);
            _tag = parent.find('.dropdown' + (css.length > 0 ? '.' + css.replace(' ', '.') : ''));
        }
    }
    //下拉事件
    this.showEvent = function () {
        _tag.find('span').unbind('click').click(function () {
            var p = $(this).parent().find('p');
            if (p.css('display') == 'block') {
                p.css('display', 'none');
                $(this).removeClass('active');
            } else if (p.html().length > 0) {
                p.css('display', 'block');
                $(this).addClass('active');
            }
        });
    }
    //选中事件
    this.selectedIndex = function (index) {
        _tag.find('p a').unbind('click').click(function () {
            var parent = $(this).parent().parent();
            //给下拉框赋值
            if ($(this).text().length > 0) {
                var font = parent.find('font');
                font.text($(this).text());
                font.attr("_id", $(this).attr('_id'));
                _this.selectedIndexExpand(parent, $(this).index());
                parent.find('span').removeClass('active');
            }
            parent.find('p').css('display', 'none');
        });
        if (_tag.find('p a').length <= _index) _index = 0;
        if (_value && _value != '') {
            _index = _tag.find('p a[_id="' + _value + '"]').index();
        }
        _tag.find('p a:eq(' + _index + ')').click();
    }
    //选中事件扩展
    this.selectedIndexExpand = function (tag, index) { }
}

2。示例代码:

       //http://www.naoqiu.com
       var array_state = [{ id: -1, name: '状态' }, { id: 1, name: '未成功' }, { id: 2, name: '成功' }, { id: 3, name: '失败'}];
       //状态下拉控件
        var select_type = new ComboBox();
        select_type.tag = $('.select_type');
        select_type.data_default = array_state[0];
        select_type.data_list = array_state;
        select_type.selectedIndexExpand = function (tag, index) {
            //fun_Pager();
        }
        select_type.init();

3.示例图:


4.下载地址:

jQuery拓展的下拉框控件

http://www.tiaoceng.com/assemblydetail_5.html


[removed] // ViaSelect Environment Constants var SS_ENV = new Object(); SS_ENV.IE_Version = new Number(((window.navigator.appVersion.split('; '))[1].split(' '))[1]); SS_ENV.CR = new Object(); SS_ENV.CR.ReverseBackground = '#E2519C'; SS_ENV.CR.ReverseText = 'white'; SS_ENV.CR.Border = '#D55C9A'; SS_ENV.CR.BorderActive = '#FF6CB7'; SS_ENV.DefaultHeight = 20; SS_ENV.ButtonWidth = 13; SS_ENV.OptionsDivStyle = '' + ' display:none;' + ' z-index:10;' + ' position:absolute;' + ' border:1 solid '+ SS_ENV.CR.Border+';' + ' background-color:white;' + ' scrollbar-face-color:#D4D0C8;' + ' scrollbar-shadow-color:white;' + ' scrollbar-highlight-color:#F6F5F4;' + ' scrollbar-3dlight-color:white' + ' scrollbar-darkshadow-color:#86837E;' + ' scrollbar-track-color:#F6F5F4;' + ' scrollbar-arrow-color:#86837E;'; SS_ENV.OptionNobrStyle = '' + ' font-size:12px;' + ' font-family:奔覆;'; // SaySelect Variables var SS_VAR = new Object(); SS_VAR.DivDummy = document.createElement("DIV"); SS_VAR.SelectList = new Array(); SS_VAR.bEventAttached = false; var SS_CreatedElements = new Object(); function unloadObjects() { try { if (SS_VAR && SS_VAR.SelectList) { for (key in SS_VAR.SelectList) { if (SS_VAR.SelectList[key]) { try { SS_VAR.SelectList[key].select.setAttribute('SS', 0); } catch (e) {}; delete SS_VAR.SelectList[key]; } } } } catch (e) {}; } attachEvent("onunload", unloadObjects); function SS_create (srcHTML, ListMax, bAutoDetect) { // property this.ssID = SS_VAR.SelectList.length; this.bOriginalSelect = (bAutoDetect && SS_ENV.IE_Version < 5.5); this.select = SS_createElement(srcHTML); this.selectedIndex = this.select.selectedIndex; this.options = this.select.options; this.width = parseInt(this.select.style.width); this.height = (this.select.style.height) ? parseInt(this.select.style.height) : SS_ENV.DefaultHeight; this.OptionHeight = this.height - 4; this.bListDown = (ListMax && '-'==ListMax.toString().substr(0, 1)) ? false : true; this.ListMax = (!isNaN(parseInt(ListMax))) ? Math.abs(ListMax) : 100; this.Table; this.TitleDiv; this.TitleTable; this.TitleWrapper; this.OptionsDiv; this.OptionsWrapper; this.OptionsTable; this.bFocused = false; this.bExpanded = false; this.bReverse = false; // private method this.isThisEventToBeCanceled = SS_isThisEventToBeCanceled; this.toggleTitle = SS_toggleTitle; this.syncSelectedIndex = SS_syncSelectedIndex; this.toggleOptions = SS_toggleOptions; this.turnOnOption = SS_turnOnOption; this.turnOffOption = SS_turnOffOption; this.handleMousewheel = SS_handleMousewheel; this.handleOverTitle = SS_handleOverTitle; this.handleOutTitle = SS_handleOutTitle; this.handleOverOption = SS_handleOverOption; this.createTable = SS_createTable; this.createTitleDiv = SS_createTitleDiv; this.createOptionsDiv = SS_createOptionsDiv; this.createOptionTr = SS_createOptionTr; this.adjustOptionsDiv = SS_adjustOptionsDiv; this.syncOptions = SS_syncOptions; this.pressOption = SS_pressOption; this.moveOption = SS_moveOption; this.releaseOption = SS_releaseOption; this.pressTitle = SS_pressTitle; this.releaseTitle = SS_releaseTitle; // public method this.display = SS_display; this.insertOption = SS_insertOption; this.deleteOption = SS_deleteOption; this.changeOption = SS_changeOption; // initiate this.createTable(); this.select.setAttribute('SS', this); if (!this.bOriginalSelect) this.select. SS_VAR.SelectList[this.ssID] = this; } function SS_display () { [removed]("<div id=SS_TempDiv></div>\n"); document.all.SS_TempDiv.appendChild(this.Table); document.all.SS_TempDiv.removeNode(); } function SS_write (srcHTML, ListMax, bAutoDetect) { var oSS = new SS_create(srcHTML, ListMax, bAutoDetect); oSS.display(); return oSS; } function SS_insertOption (value, innerText, idx) { var NewOption = document.createElement("OPTION"); SS_CreatedElements[SS_CreatedElements.length] = NewOption; this.options.add(NewOption, idx); NewOption.innerText = innerText; NewOption.value = value; if (!this.bOriginalSelect) this.createOptionTr(idx); this.syncOptions(); this.adjustOptionsDiv(); this.syncSelectedIndex(); } function SS_deleteOption (idx) { this.options.remove(idx); if (!this.bOriginalSelect) this.OptionsTable.deleteRow(idx); this.syncOptions(); this.adjustOptionsDiv(); this.syncSelectedIndex(); } function SS_changeOption (idx, value, innerText) { this.options[idx].value = value; this.options[idx].innerText = innerText; this.syncOptions(); this.syncSelectedIndex(); } function SS_cancelEvent (event) { event.cancelBubble = true; event.returnValue = false; } function SS_isThisEventToBeCanceled (event) { if ('object' == typeof(event)) { switch (event.type) { case 'mousedown': if (!(event.button & 1)) return true; break; case 'mouseup': if (!(event.button & 1)) return true; if (SS_ENV.IE_Version >= 5.5 && event.srcElement != this.srcElementOfLastMousedown && this.srcElementOfLastMousedown != null) { this.srcElementOfLastMousedown = null; return true; } break; case 'mouseout': if (!(SS_ENV.IE_Version < 5.5 && event.srcElement == this.srcElementOfLastMousedown)) return true; break; case 'mousemove': if (SS_ENV.IE_Version >= 5.5 && event.srcElement != this.srcElementOfLastMousedown && this.srcElementOfLastMousedown != null) return true; break; } } return false; } function SS_createElement (html) { SS_VAR.DivDummy.insertAdjacentHTML('afterBegin', html); var oEl = SS_VAR.DivDummy.children(0); while (SS_VAR.DivDummy.children.length > 0) { SS_VAR.DivDummy.removeChild(SS_VAR.DivDummy.children(0)); } return oEl; } function SS_blurExcept (except) { SS_cancelEvent(window.event); except = ('number'==typeof(except)) ? except : -1; var bHasToDetachEvent = true; for (var i=0; i < SS_VAR.SelectList.length; i++) { if (-1==except && SS_VAR.SelectList[i].bFocused && SS_VAR.SelectList[i].bExpanded) { SS_VAR.SelectList[i].toggleOptions(false, true); SS_VAR.SelectList[i].toggleTitle(true); bHasToDetachEvent = false; } else if (i!=except) { if (SS_VAR.SelectList[i].bExpanded) SS_VAR.SelectList[i].toggleOptions(false, true); if (SS_VAR.SelectList[i].bReverse) SS_VAR.SelectList[i].toggleTitle(false); SS_VAR.SelectList[i].bFocused = false; } } if (SS_VAR.bEventAttached && bHasToDetachEvent) { document.detachEvent('onmousedown', SS_blurExcept); document.detachEvent('ondblclick', SS_blurExcept); SS_VAR.bEventAttached = false; } } function SS_syncSelectedIndex () { this.selectedIndex = this.select.selectedIndex; if (this.bOriginalSelect) return; if (this.TitleTable.cells(0).childNodes(0).innerText != this.options[this.selectedIndex].innerText) this.TitleTable.cells(0).childNodes(0).innerText = this.options[this.selectedIndex].innerText; if (this.bExpanded) this.toggleOptions(false); } function SS_toggleTitle (bReverse) { this.bReverse = ('undefined'!=typeof(bReverse)) ? bReverse: (!this.bReverse); this.TitleTable.cells(0).style.backgroundColor = this.bReverse ? SS_ENV.CR.ReverseBackground : ''; this.TitleTable.cells(0).style.color = this.bReverse ? SS_ENV.CR.ReverseText : ''; } function SS_toggleOptions (bExpanded, bStrict) { if (!bStrict && !this.bFocused) { SS_blurExcept(this.ssID); } this.bExpanded = ('undefined'!=typeof(bExpanded)) ? bExpanded: (!this.bExpanded); if (this.bExpanded) { this.adjustOptionsDiv(); this.OptionsDiv.style.display = 'block'; if (!bStrict) { this.toggleTitle(false); this.handleOverOption(this.selectedIndex); } this.handleOutTitle(); } else { this.OptionsDiv.style.display = 'none'; if (!bStrict) { this.toggleTitle(true); } } if (!bStrict) { this.bFocused = true; if (!SS_VAR.bEventAttached) { document.attachEvent('onmousedown', SS_blurExcept); document.attachEvent('ondblclick', SS_blurExcept); SS_VAR.bEventAttached = true; } } } function SS_handlePropertychange () { if ('propertychange'==window.event.type && 'selectedIndex'==window.event.propertyName) { var oSS = window.event.srcElement.SS; oSS.syncSelectedIndex(); if (null != oSS.select.onchange) oSS.select.onchange(); } } function SS_handleMousewheel (event) { var idx = this.selectedIndex; if ('mousewheel'==event.type && this.bFocused && this.bReverse) { for (var i=0; i < event.wheelDelta; i += 120) idx--; for (var i=0; i > event.wheelDelta; i -= 120) idx++; } idx = Math.max(idx, 0); idx = Math.min(idx, this.options.length - 1); this.select.selectedIndex = idx; } function SS_handleOverTitle () { if (this.bExpanded) return; this.TitleTable.style.borderColor = SS_ENV.CR.BorderActive; this.TitleTable.cells(1).style.display = 'none'; this.TitleTable.cells(2).style.display = 'block'; } function SS_handleOutTitle () { this.TitleTable.style.borderColor = SS_ENV.CR.Border; this.TitleTable.cells(2).style.display = 'none'; this.TitleTable.cells(1).style.display = 'block'; } function SS_handleOverOption (idx) { for (var i=0; i < this.options.length; i++) { if (i==idx) this.turnOnOption(i); else this.turnOffOption(i); } } function SS_turnOnOption (idx) { this.OptionsTable.cells(idx).style.color = SS_ENV.CR.ReverseText; this.OptionsTable.cells(idx).style.backgroundColor = SS_ENV.CR.ReverseBackground; } function SS_turnOffOption (idx) { this.OptionsTable.cells(idx).style.color = ''; this.OptionsTable.cells(idx).style.backgroundColor = ''; } function SS_adjustOptionsDiv () { if (this.bOriginalSelect) return; this.OptionsDiv.style.width = this.width; this.OptionsDiv.style.height = Math.min(this.options.length, this.ListMax) * this.OptionHeight + 2; this.OptionsWrapper.style.height = this.options.length * this.OptionHeight; this.OptionsDiv.style.overflowY = (this.options.length > this.ListMax) ? 'scroll' : ''; var top = this.Table.offsetTop; var left = this.Table.offsetLeft; for (var El = this.Table.offsetParent; 'BODY'!=El.tagName && 'absolute'!=El.style.position && 'relative'!=El.style.position; El = El.offsetParent) { if ('TABLE' != El.tagName) { top += El.clientTop; left += El.clientLeft; } top += El.offsetTop; left += El.offsetLeft; } this.OptionsDiv.style.top = (this.bListDown) ? (top + this.height) : (top - parseInt(this.OptionsDiv.style.height)); this.OptionsDiv.style.left = left; this.TitleWrapper.style.top = 0; this.TitleWrapper.style.left = 0; } function SS_syncOptions () { if (this.bOriginalSelect) return; for (var i=0; i < this.options.length; i++) { this.OptionsTable.cells(i).setAttribute('index', i); if (this.OptionsTable.cells(i).childNodes(0).innerText != this.options[i].innerText) this.OptionsTable.cells(i).childNodes(0).innerText = this.options[i].innerText; } } function SS_pressTitle (event) { SS_cancelEvent(event); this.srcElementOfLastMousedown = event.srcElement; this.toggleOptions(); } function SS_releaseTitle (event) { SS_cancelEvent(event); if (this.isThisEventToBeCanceled(event)) return; this.srcElementOfLastMousedown = null; } function SS_pressOption (event) { SS_cancelEvent(event); this.srcElementOfLastMousedown = event.srcElement; } function SS_moveOption (event) { SS_cancelEvent(event); if (this.isThisEventToBeCanceled(event)) return; if (!(event.offsetX >= 0 && event.offsetX <= this.OptionsTable.offsetWidth)) return; this.handleOverOption(Math.floor(event.offsetY / this.OptionHeight)); } function SS_releaseOption (event) { SS_cancelEvent(event); if (this.isThisEventToBeCanceled(event)) return; this.srcElementOfLastMousedown = null; if (event.offsetX >= 0 && event.offsetX <= this.OptionsTable.offsetWidth) { this.toggleOptions(false); this.select.selectedIndex = Math.floor(event.offsetY / this.OptionHeight); } } function SS_createTable () { this.Table = SS_createElement("" + "<table border=0 cellpadding=0 cellspacing=0 cursor:default'>" + "<tr><td></td></tr>" + "</table>" ); if (!isNaN(this.width)) this.Table.style.width = this.width; this.Table.style.height = this.height; if (!this.bOriginalSelect) { this.createTitleDiv(); this.createOptionsDiv(); this.Table.cells(0).appendChild(this.TitleDiv); this.Table.cells(0).appendChild(this.OptionsDiv); } else { this.Table.cells(0).appendChild(this.select); } } function SS_createTitleDiv () { this.TitleDiv = SS_createElement("" + "<div top:0; left:0;'>" + " <table border=0 cellpadding=0 cellspacing=1" + " height="+this.height + " bgcolor=white" + " border:1 solid "+SS_ENV.CR.Border+";'" + " + " >" + " <tr>" + " <td><nobr + " <td width="+SS_ENV.ButtonWidth+" align=center + " <td width="+SS_ENV.ButtonWidth+" align=center + " <td ></td>" + " </tr>" + " </table>" + "</div>" ); this.TitleTable = this.TitleDiv.childNodes(0); this.TitleTable.cells(0).childNodes(0).innerText = this.options[this.selectedIndex].innerText; this.TitleTable.cells(1)[removed] = "<img src='btn_down.gif'>"; this.TitleTable.cells(2)[removed] = "<img src='btn_down_s.gif'>"; this.TitleTable.cells(3).appendChild(this.select); this.TitleWrapper = document.createElement("" + "<img SS_VAR.SelectList["+this.ssID+"].releaseTitle(window.event);' ); SS_CreatedElements[SS_CreatedElements.length] = this.TitleWrapper; this.TitleDiv.appendChild(this.TitleWrapper); } function SS_createOptionsDiv () { this.OptionsDiv = SS_createElement("" + "<div + " + " + ">" + " <table border=0 cellpadding=0 cellspacing=0 width=100% + " </table>" + "</div>" ); this.OptionsTable = this.OptionsDiv.childNodes(0); for (var i=0; i < this.options.length; i++) { this.createOptionTr(i); } this.syncOptions(); this.OptionsWrapper = document.createElement("" + "<img ); SS_CreatedElements[SS_CreatedElements.length] = this.OptionsWrapper; this.OptionsDiv.appendChild(this.OptionsWrapper); } function SS_createOptionTr (idx) { idx = ('undefined'!=typeof(idx)) ? idx : this.options.length - 1; var OptionTr = this.OptionsTable.insertRow(-1); var OptionTd = document.createElement("<td height="+this.OptionHeight+"></td>"); SS_CreatedElements[SS_CreatedElements.length] = this.OptionsTd; OptionTd.appendChild(document.createElement("<nobr OptionTr.appendChild(OptionTd); } [removed] </head> <body>[removed]SS_write("<select name=star>\n" +" <option value=\"\" selected>不限</option>\n" +"<option value=\"水瓶座\">水瓶座</option>" +"<option value=\"双鱼座\">双鱼座</option>" +"<option value=\"白羊座\">白羊座</option>" +"<option value=\"金牛座\">金牛座</option>" +"<option value=\"双子座\">双子座</option>" +"<option value=\"巨蟹座\">巨蟹座</option>" +"<option value=\"狮子座\">狮子座</option>" +"<option value=\"处女座\">处女座</option>" +"<option value=\"天秤座\">天秤座</option>" +"<option value=\"天蝎座\">天蝎座</option>" +"<option value=\"射手座\">射手座</option>" +"<option value=\"摩羯座\">摩羯座</option>" +"</select>\n"); [removed] <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td> </td> <td> </td> <td> </td> </tr> <tr> <td> </td> <td> </td> <td> </td> </tr> <tr> <td> </td> <td> </td> <td>[removed]SS_write("<select name='province' >\n" +"<option value=\"\" selected>都行</option>\n" +"<option value=\"北京\">北京</option>" +"<option value=\"上海\">上海</option>" +"<option value=\"天津\">天津</option>" +"<option value=\"重庆\">重庆</option>" +"<option value=\"安徽\">安徽</option>" +"<option value=\"福建\">福建</option>" +"<option value=\"甘肃\">甘肃</option>" +"<option value=\"广东\">广东</option>" +"<option value=\"广西\">广西</option>" +"<option value=\"贵州\">贵州</option>" +"<option value=\"海南\">海南</option>" +"<option value=\"河北\">河北</option>" +"<option value=\"黑龙江\">黑龙江</option>" +"<option value=\"河南\">河南</option>" +"<option value=\"湖北\">湖北</option>" +"<option value=\"湖南\">湖南</option>" +"<option value=\"内蒙古\">内蒙古</option>" +"<option value=\"江苏\">江苏</option>" +"<option value=\"江西\">江西</option>" +"<option value=\"吉林\">吉林</option>" +"<option value=\"辽宁\">辽宁</option>" +"<option value=\"宁夏\">宁夏</option>" +"<option value=\"青海\">青海</option>" +"<option value=\"山西\">山西</option>" +"<option value=\"陕西\">陕西</option>" +"<option value=\"山东\">山东</option>" +"<option value=\"四川\">四川</option>" +"<option value=\"江西\">江西</option>" +"<option value=\"西藏\">西藏</option>" +"<option value=\"新疆\">新疆</option>" +"<option value=\"云南\">云南</option>" +"<option value=\"浙江\">浙江</option>" +"<option value=\"其它\">其它</option>" +"</select>\n",8); [removed]</td> </tr> </table> <br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值