`
keimon
  • 浏览: 74762 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

模拟下拉框

阅读更多

调用方式:$("select[data-class]").selectModel();


;
(function ($, window, document, undefined) {

    "use strict";

    var pluginName = "selectModel",
        defaults = {
            effect: {
                "type": "standard",
                "speed": "fast"
            },
            emptyMessage: 'Empty',
            activeLi:'liActive'
        };

    function Plugin(element, options) {
        this.element = element;
        this.options = $.extend({}, defaults, options);
        this.instance;
        this.init();
    }

    Plugin.prototype = {

        /*
         * 初始化
         */
        init: function () {
            this.instance = this._createInstance();
            this._createElements();
            this._hideSelect();
            this._setEvents();
        },

        /*
         * 产生ID,及是否展开的状态
         */
        _createInstance: function () {
            return {
                selectId: +new Date(),
                state: false
            };
        },

        /*
        * 隐藏原有select
         */
        _hideSelect: function () {
            $(this.element).hide();
        },

        /*
         * 设置点击事件
         */
        _setEvents: function () {

            var self = this;
            $(document).on("click", "html", function (e) {
                e.stopPropagation();
                self._closeSelectBox(true);
            });
        },

        /*
         * 模拟select的html结构
         */
        _createElements: function () {

            var self = this;
            var selectModelEl = $('<div/>', {
                id: 'selectbox_' + self.instance.selectId,
                'class': 'selectbox '+ $(self.element).attr('data-class'),
                data: {'sourceElement': self.element}
            });
            var selectValueWrap = $('<p/>', {
                'class': 'select-info like-input'
            });

            var selectBoxEl = self._createSelectOptionWrap();
            var isSelectBoxEmpty = selectBoxEl == null ? true : false;
            var selectValueEl = self._createSelectValueWrap(isSelectBoxEmpty);

            var selectModelArrowWrap = $('<span/>', {
                'class': 'select-arrow'
            });
            var selectModelArrow = $('<i/>', {
                'class': 'ui-arrow-bottom dark-ui-arrow-bottom'
            });

            selectModelArrowWrap.append(selectModelArrow);
            selectValueWrap.append(selectModelArrowWrap).append(selectValueEl);
            selectModelEl.append(selectValueWrap).append(selectBoxEl);

            self.selectModelEl = selectModelEl;
            $(self.element).before(self.selectModelEl);
            self._setSelectBoxEvents(isSelectBoxEmpty);
        },

        /*
         * 点击select头部的事件
         */
        _setSelectBoxEvents: function (isSelectBoxEmpty) {

            var self = this;
            var selectModelEl = $("div#selectbox_" + this.instance.selectId);

            if (!isSelectBoxEmpty) {
                selectModelEl.find(".select-info").click(function (e) {
                    e.stopPropagation();
                    self._clickSelectOption();
                });
            }
        },

        /*
         * 模拟select的option内容
         */
        _createSelectOptionWrap: function () {

            var self = this;
            var selectBoxEl = $('<div/>', {
                'class': 'selectbox-drop'
            });

            var selectBoxOptionsEl = $('<ul/>', {
                'class': 'select-results'
            });

            $(self.element).children().each(function (index) {
                var liClass = index==0  ?  self.options.activeLi : '';
                var selectModelLiEl = $('<li/>', {
                    rel: $(this).val(),
                    text: $(this).text(),
                    'class': liClass,
                    click: function (e) {
                        e.stopPropagation();
                        self._changeSelectValue(self, this);
                    }
                });
                selectBoxOptionsEl.append(selectModelLiEl);
            });

            selectBoxEl.append(selectBoxOptionsEl);

            return $(this.element).children().length == 0 ? null : selectBoxEl;
        },

        _createSelectValueWrap: function (isSelectBoxEmpty) {
            var selectValueEl = $('<span/>', {
                'class': 'select-value',
                text: isSelectBoxEmpty ? this.options.emptyMessage : $(this.element).children().first().text()
            });

            return selectValueEl;
        },

        /*
         * 模拟select内容的展开与否
         */
        _clickSelectOption: function (stageReady) {

            if (this.instance.state) {
                this._closeSelectBox();
            }else {
                if (!stageReady) {
                    this._closeOthers();
                }else{
                    this._openSelectBox();
                }
            }
        },

        /*
         * 点击模拟select中的option内容
         */
        _changeSelectValue: function (self, clickedEl) {

            var selectValueEl = $("#selectbox_" + this.instance.selectId).find(".select-value");
            selectValueEl.text($(clickedEl).text());
            this._closeSelectBox(true);

            $(clickedEl).addClass(this.options.activeLi).siblings().removeClass(this.options.activeLi);

            $(this.element).val($(clickedEl).attr('rel'));
        },

        /*
         * 关闭模拟select
         */
        _closeSelectBox: function (internal) {

            $("#selectbox_" + this.instance.selectId).removeClass('selectbox-active active');
            var selectBoxEl = $("#selectbox_" + this.instance.selectId).find(".selectbox-drop");
            if (selectBoxEl.is(":animated") && !internal) {
                return false;
            }
            this.instance.state = false;

            switch (this.options.effect.type) {

                case "fade":
                    selectBoxEl.fadeOut(this.options.effect.speed);
                    break;
                case "slide":
                    selectBoxEl.slideUp(this.options.effect.speed);
                    break;
                case "standard":
                    selectBoxEl.hide();
                    break;
                default:
                    selectBoxEl.slideUp(this.options.effect.speed);
                    break;

            }
        },

        /*
         * 展开模拟select
         */
        _openSelectBox: function () {

            $("#selectbox_" + this.instance.selectId).addClass('selectbox-active active');
            var selectBoxEl = $("#selectbox_" + this.instance.selectId).find(".selectbox-drop");
            if (selectBoxEl.is(":animated")) {
                return false;
            }
            this.instance.state = true;


            switch (this.options.effect.type) {

                case "fade":
                    selectBoxEl.fadeIn(this.options.effect.speed);
                    break;
                case "slide":
                    selectBoxEl.slideDown(this.options.effect.speed);
                    break;
                case "standard":
                    selectBoxEl.show();
                    break;
                default:
                    selectBoxEl.slideDown(this.options.effect.speed);
                    break;
            }
        },

        /*
         * 关闭其他select
         */
        _closeOthers: function () {

            var self = this;

            $('div[id^=selectbox_]').each(function (index) {
                var el = $("div#" + $(this).attr("id"));

                if (el.data("sourceElement")) {
                    var sourceEl = $.data(this, "sourceElement");
                    var selectModelInst = $.data(sourceEl, "plugin_" + pluginName);
                    if (self.instance.selectId != selectModelInst.instance.selectId) {
                        if (selectModelInst.instance.state) {
                            selectModelInst._closeSelectBox(true);
                        }
                    }
                }
            });
            self._clickSelectOption(true);
        }
    };

    $.fn[pluginName] = function (options) {

        return this.each(function () {
            if (!$.data(this, "plugin_" + pluginName)) {
                $.data(this, "plugin_" + pluginName, new Plugin(this, options));
            }
        });
    };

})(jQuery, window, document);

分享到:
评论

相关推荐

    JQuery DIV模拟下拉框(单选、多选)

    "JQuery DIV模拟下拉框(单选、多选)"就是一种使用JQuery和JavaScript技术,通过`&lt;div&gt;`元素来模拟原生的下拉框,并且支持单选和多选功能的解决方案。 1. **JQuery**:JQuery是一个广泛使用的JavaScript库,它简化...

    div模拟下拉框

    此时,开发者会利用CSS和JavaScript(通常配合jQuery或其他库)通过`div`元素来模拟下拉框的效果。 1. **CSS基础** CSS是层叠样式表(Cascading Style Sheets)的缩写,用于控制网页元素的样式。在div模拟下拉框中...

    div模拟下拉框的Demo

    使用div模拟下拉框则可以自由调整外观,包括字体、颜色、边框、阴影等,并能实现更丰富的动画效果。 在Demo中,通常会有一个主div作为下拉框的容器,点击时显示或隐藏下拉选项列表。这个列表也是由div组成的,每个...

    jquery 实现的下拉框模拟

    这种模拟下拉框可以提供更灵活的设计和交互体验。 首先,原生的 HTML 下拉框虽然简单易用,但在某些情况下可能无法满足设计师和开发者的需求,例如自定义样式、多级联动、异步加载选项等。jQuery 提供的解决方案...

    jQuery模拟下拉框选择对应菜单的内容

    在本文中,我们将深入探讨如何使用jQuery来模拟下拉框选择菜单的功能,这对于网页界面设计尤其有用,可以提供更友好的用户体验。下拉框在网页交互中常常用于节省空间并保持页面整洁,尤其是在有很多选项可供选择时。...

    模拟下拉框select

    模拟下拉框select,之前穿过一个,是纯div和li写的,现在这个的本质还是select,虽然没有经过实验,不过应该不用怕开发的时候取不到值这个问题,修改起来也很简单,只要有点css基础的都应该没有问题~

    js css 模拟html下拉框

    CSS在模拟下拉框的过程中扮演了关键角色。我们可以通过CSS定义下拉按钮的样式,包括背景色、边框、字体等,同时也可以为显示的选项列表设置样式,如宽度、高度、过渡效果等。例如: ```css .custom-select { ...

    DIV模拟select下拉框

    jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理和动画等功能,使得开发这样的模拟下拉框变得更加简单。通过jQuery,我们可以轻松地监听用户的行为,如点击事件,然后动态显示或隐藏下拉选项,同时...

    用jQuery实现的模拟下拉框代码

    【jQuery模拟下拉框详解】 在网页设计中,由于浏览器默认的下拉框样式单一且在某些情况下(如IE6)可能出现显示问题,因此开发者常常选择使用jQuery来模拟自定义样式的下拉框,以提升用户体验和视觉效果。本文将...

    combobox:js模拟下拉框

    js模拟下拉框 使用 只需在jquery后引入jquery.validation文件 [removed][removed] [removed][removed] 初始化 选择元素调用combobox方法传入配置项 $('select').combobox(options); 方法 调用方式 //选择元素调用...

    jQuery模拟select下拉框三级城市联动代码.zip

    - 解析返回的JSON或XML数据,根据数据结构动态创建新的`&lt;option&gt;`元素,插入到对应的模拟下拉框中。 - 使用`append()`、`html()`等jQuery方法更新DOM结构。 5. **CSS样式定制**: 为了使模拟的下拉框与原生的`...

    自定义-js模仿下拉框效果

    自定义-js模仿下拉框效果 测过IE6/7/8 ff5.0 chremo 12.0. 是用li来模仿的,隐藏存在一个select方便form提交,其实既然只是获取选定后的数据,也可以用隐藏的input:text 代替 (如果出现什么异常可以给本人留言)

    jQuery模拟select下拉框多选和单选插件.zip

    本资源“jQuery模拟select下拉框多选和单选插件.zip”提供了一种利用jQuery实现模拟下拉框选择功能的方法,特别适合在网页中创建具有多选和单选功能的下拉菜单,而无需使用原生的`&lt;select&gt;`元素。这样的插件对于提升...

    jQuery模拟select下拉框插件.zip

    在IT行业中,JavaScript...在HTML结构中,我们可以用一个普通的`&lt;select&gt;`元素作为基础,然后通过jQuery选择器找到这个元素,调用插件的方法将其转换为我们需要的模拟下拉框。例如: ```html 选项1 选项2 选项3 ...

    jquery模拟div多选checkbox下拉框

    2. **事件处理**:模拟下拉框需要响应用户的点击事件,这通常涉及到`.click()`或`.change()`事件。当用户点击某个选项或触发其他交互时,事件处理器会更新选择状态并可能同步到后端数据。 3. **CSS样式和动画**:...

    用jQuery模拟select下拉框的简单示例代码

    在网页设计中,美工有时会因为HTML默认的`&lt;select&gt;`下拉框样式不符合设计需求,特别是默认的下拉箭头图标不美观,而选择使用JavaScript和CSS自定义一个模拟下拉框的效果。本示例是使用jQuery来实现这样一个功能,...

    用JS模拟来select下拉框控件的特效 可用作下拉菜单来用.zip

    本压缩包中的内容就是一种利用JS来模拟下拉框特效的方法,适用于创建具有自定义样式的下拉菜单。 首先,我们需要理解原生HTML Select的基本结构和属性。一个基本的Select元素包括一个`&lt;select&gt;`标签,其中包含多个`...

    原生js text文本框模拟select下拉框美化点击下拉菜单选择value赋值效果源码.zip

    首先,我们来看一下这个模拟下拉框的基本原理。通常,HTML的`&lt;select&gt;`元素用于创建下拉列表,但其样式受限。为了获得更灵活的样式控制,开发者通常会选择使用JavaScript和CSS来构建自定义的下拉组件。在这个案例中...

    简单下拉框美化

    通过`&lt;div&gt;`元素模拟下拉框的容器,`&lt;ul&gt;`或`&lt;ol&gt;`元素模拟选项列表,利用JavaScript处理点击事件和展开收缩逻辑。这样可以实现更丰富的动画效果和自定义布局。 4. **响应式设计**:确保下拉框在不同设备和屏幕尺寸...

Global site tag (gtag.js) - Google Analytics