var SelectBox = function (select, div) { this.select = select; this.div = div; this.divOptions = div.find('.select_options'); this.divShow = div.find('.select_showbox'); this.selected = null; } var SelectD = { _selects: {}, show: [], load: function (select) { select = $(select); var sid = select.attr('data-select'); var selectBox; if (!sid) { if (select[0].tagName != 'SELECT') { return false; } var div = this._createDiv(select); select.hide(); select.before(div); sid = 's' + (new Date().valueOf()); select.attr('data-select', sid); selectBox = new SelectBox(select, div); selectBox.divShow.on('click', selectBox, this._showboxClick); selectBox.divOptions.on('click', selectBox, this._showOptionsClick); this._selects[sid] = selectBox; } else { selectBox = this._selects[sid]; } var selected = select.find('option:selected'); selectBox.divShow.text(selected.text()); selectBox.divOptions.html(this._createOptions(select)); return select; }, _createDiv: function (select) { var html = '<div class="select_box"><div class="select_showbox"></div><ul class="select_options"></ul></div>'; return $(html); }, _createOptions: function (select) { var html = ''; var childs = select.children(); for (var i = 0; i < childs.length; i++) { var op = childs.eq(i); var tagName = op[0].tagName; if (tagName == 'OPTGROUP') { html += '<li class="select_group">' + op.attr('label') + '</li>'; var childOp = op.children(); for (var n = 0; n < childOp.length; n++) { var node = childOp.eq(n); html += '<li class="select_item" data-val="' + node.val() + '">' + node.text() + '</li>'; } } else if (tagName == 'OPTION') { html += '<li class="select_item" data-val="' + op.val() + '">' + op.text() + '</li>'; } } return html; }, _showboxClick: function (e) { var box = e.data; var options = box.divOptions.toggle(); if (options.is(':visible')) { box.divShow.addClass('halo'); SelectD.show.push(box); } e.stopPropagation(); }, _showOptionsClick: function (e) { var ev = e || window.event; var dom = $(ev.target || ev.srcElement); if (dom.is('li')) { if (dom.hasClass('select_group')) { e.stopPropagation(); } else if (dom.hasClass('select_item')) { var box = e.data; if (box.selected) { box.selected.removeClass('select_active'); } dom.addClass('select_active'); var sTxet = dom.text(); var sValue = dom.attr('data-val'); box.select.val(sValue); box.select.trigger('change'); box.selected = dom; box.divShow.text(sTxet); } } }, closeAll: function () { for (var i = SelectD.show.length - 1; i >= 0; i--) { var box = SelectD.show[i]; box.divOptions.hide(); box.divShow.removeClass('halo'); SelectD.show.splice(i, 1); } }, init: function () { $(document).on('click', SelectD.closeAll); } }; $(SelectD.init); $.fn.SelectLoad = function () { SelectD.load(this); }
提示:你可以先修改部分代码再运行。
转载请注明:有爱前端 » 来,把select改一下