zoukankan      html  css  js  c++  java
  • 【js】【Demo】ySelect例

    1、html

    引入,包地址https://files.cnblogs.com/files/lanofsky/ySelect.zip
        <link href="~/Scripts/ySelect/css/ySelect.css" rel="stylesheet" />
        <script src="~/Scripts/ySelect/js/ySelect.js"></script>

    页面
    <select class="form-control RoleInfoAll"  multiple="multiple"></select>                

    2、修改ySelect.js

    (function ($) {
        $.fn.ySelect = function (options) {
            var defaultOptions = {
                placeholder: '请选择',
                numDisplayed: 4,
                overflowText: '已选 {n} 个',
                isOverflow: false,
                searchText: '搜索',
                showSearch: true,
                showAll: false,
                changeBack: null,//回调function(tests,values)
                isCheck:true,//多选
            }
            if (typeof options == 'string') {
                var settings = options;
            }
            else {
    
                var settings = $.extend(true, {}, defaultOptions, options);
            }
    
    
            /**
             * Constructor
             */
            function ySelect(select, settings) {
                this.$select = $(select);
                this.settings = settings;
                this.create();
            }
    
    
            /**
             * Prototype class
             */
            ySelect.prototype = {
                create: function () {
                    var selectWidth = this.$select.width();
                    var multiple = this.$select.is('[multiple]') ? ' multiple' : '';
                    this.$select.wrap('<div class="fs-wrap' + multiple + '" data-ischeck="' + settings.isCheck +'" style="100%"></div>');
                    this.$select.before('<div class="fs-label-wrap"><div class="fs-label">' + this.settings.placeholder + '</div><span class="fs-arrow"><img class="fs-arrowimg"  src="/images/timg.png"/></span></div>');
                    this.$select.before('<div class="fs-dropdown hidden"><div class="fs-options"></div></div>');
                    this.$select.addClass('hidden');
                    this.$wrap = this.$select.closest('.fs-wrap');
                    this.reload();
                },
    
                reload: function () {
                    if (this.settings.showSearch) {
                        var search = '<div class="fs-search"><input type="search" style=' + (this.settings.showAll ? "" :"100%")+' placeholder="' + this.settings.searchText + '" />';
                        if (this.settings.showAll) {
                            search +='<span class="fs-selectAll"><i class="fa fa-check-square-o"></i></span>';
                        }
                        search += '</div>';
                        this.$wrap.find('.fs-dropdown').prepend(search);
                    }
                    var choices = this.buildOptions(this.$select);
                    this.$wrap.find('.fs-options').html(choices);
                    this.reloadDropdownLabel();
                },
    
                destroy: function () {
                    this.$wrap.find('.fs-label-wrap').remove();
                    this.$wrap.find('.fs-dropdown').remove();
                    this.$select.unwrap().removeClass('hidden');
                },
    
                buildOptions: function ($element) {
                    var $this = this;
    
                    var choices = '';
                    $element.children().each(function (i, el) {
                        var $el = $(el);
                        if ('optgroup' == $el.prop('nodeName').toLowerCase()) {
                            choices += '<div class="fs-optgroup">';
                            choices += '<div class="fs-optgroup-label">' + $el.prop('label') + '</div>';
                            choices += $this.buildOptions($el);
                            choices += '</div>';
                        }
                        else {
                            var selected = $el.is('[selected]') ? ' selected' : '';
                            choices += '<div class="fs-option' + selected + '" data-value="' + $el.prop('value') + '"><span class="fs-checkbox"><i></i></span><div class="fs-option-label">' + $el.html() + '</div></div>';
                        }
                    });
    
                    return choices;
                },
    
                reloadDropdownLabel: function () {
                    var settings = this.settings;
                    var labelText = [];
                    var values = [];
    
                    this.$wrap.find('.fs-option.selected').each(function (i, el) {
                        labelText.push($(el).find('.fs-option-label').text());
                        values.push($(el).data("value"));
                    });
    
                    if (labelText.length < 1) {
                        labelText = settings.placeholder;
                    }
                    else {
                        if (settings.isOverflow && labelText.length > settings.numDisplayed) {
                            labelText = settings.overflowText.replace('{n}', labelText.length);
                        }
                        else {
                            labelText = labelText.join(', ');
                        }
                    }
    
                    this.$wrap.find('.fs-label').html(labelText);
                    this.$select.change();
                    if (this.settings.changeBack && typeof (this.settings.changeBack)=="function") {
                        this.settings.changeBack(labelText, values);
                    }
    
                },
                setwrap: function () {
                    if(settings.isCheck==false)
                        this.$wrap.find('.fs-dropdown').addClass('hidden');
                    return "123";
                }, 
            }
    
    
            /**
             * Loop through each matching element
             */
            return this.each(function () {
                var data = $(this).data('ySelect');
    
                if (!data) {
                    data = new ySelect(this, settings);
                    $(this).data('ySelect', data);
                }
    
                if (typeof settings == 'string') {
                    data[settings]();
                }
            });
        }
    
    
        /**
         * Events
         */
        window.ySelect = {
            'active': null,
            'idx': -1
        };
    
        function setIndexes($wrap) {
            $wrap.find('.fs-option:not(.hidden)').each(function (i, el) {
                $(el).attr('data-index', i);
                $wrap.find('.fs-option').removeClass('hl');
            });
            $wrap.find('.fs-search input').focus();
            window.ySelect.idx = -1;
        }
    
        function setScroll($wrap) {
            var $container = $wrap.find('.fs-options');
            var $selected = $wrap.find('.fs-option.hl');
    
            var itemMin = $selected.offset().top + $container.scrollTop();
            var itemMax = itemMin + $selected.outerHeight();
            var containerMin = $container.offset().top + $container.scrollTop();
            var containerMax = containerMin + $container.outerHeight();
    
            if (itemMax > containerMax) { // scroll down
                var to = $container.scrollTop() + itemMax - containerMax;
                $container.scrollTop(to);
            }
            else if (itemMin < containerMin) { // scroll up
                var to = $container.scrollTop() - containerMin - itemMin;
                $container.scrollTop(to);
            }
        }
    
        $(document).on('click', '.fs-selectAll', function () {
            $(this).parent().next().find('.fs-option.selected').click();
            $(this).parent().next().find('.fs-option').click();
            $(this).addClass('selected');
        });
        $(document).on('click', '.fs-selectAll.selected', function () {
            $(this).parent().next().find('.fs-option.selected').click();
            $(this).removeClass('selected');
        });
    
        $(document).on('click', '.fs-option', function () {
            var $wrap = $(this).closest('.fs-wrap');
    
    
            if ($wrap.hasClass('multiple')) {
                //单选
                if ($wrap.data("ischeck") == false) {
                    $wrap.find('.fs-option').removeClass('selected');
                }
                var selected = [];
    
                $(this).toggleClass('selected');
                $wrap.find('.fs-option.selected').each(function (i, el) {
                    selected.push($(el).attr('data-value'));
                });
            }
            else {
                var selected = $(this).attr('data-value');
                $wrap.find('.fs-option').removeClass('selected');
                $(this).addClass('selected');
                $wrap.find('.fs-dropdown').addClass('hidden');
            }
    
            $wrap.find('select').val(selected);
            $wrap.find('select').ySelect('reloadDropdownLabel');
            $wrap.find('select').ySelect('setwrap');
        });
        $(document).on('keyup', '.fs-search input', function (e) {
            if (40 == e.which) {
                $(this).blur();
                return;
            }
    
            var $wrap = $(this).closest('.fs-wrap');
            var keywords = $(this).val();
    
            $wrap.find('.fs-option, .fs-optgroup-label').removeClass('hidden');
    
            if ('' != keywords) {
                $wrap.find('.fs-option').each(function () {
                    var regex = new RegExp(keywords, 'gi');
                    if (null === $(this).find('.fs-option-label').text().match(regex)) {
                        $(this).addClass('hidden');
                    }
                });
    
                $wrap.find('.fs-optgroup-label').each(function () {
                    var num_visible = $(this).closest('.fs-optgroup').find('.fs-option:not(.hidden)').length;
                    if (num_visible < 1) {
                        $(this).addClass('hidden');
                    }
                });
            }
    
            setIndexes($wrap);
        });
    
        $(document).on('click', function (e) {
            var $el = $(e.target);
            var $wrap = $el.closest('.fs-wrap');
            if (0 < $wrap.length) {
                if ($el.hasClass('fs-label') || $el.hasClass('fs-arrow') || $el.hasClass('fs-arrowimg')) {
                    window.ySelect.active = $wrap;
                    var is_hidden = $wrap.find('.fs-dropdown').hasClass('hidden');
                    $('.fs-dropdown').addClass('hidden');
    
                    if (is_hidden) {
                        $wrap.find('.fs-dropdown').removeClass('hidden');
                    }
                    else {
                        $wrap.find('.fs-dropdown').addClass('hidden');
                    }
    
                    setIndexes($wrap);
                }
            }
            else {
                $('.fs-dropdown').addClass('hidden');
                window.ySelect.active = null;
            }
        });
    
        $(document).on('keydown', function (e) {
            var $wrap = window.ySelect.active;
    
            if (null === $wrap) {
                return;
            }
            else if (38 == e.which) { // up
                e.preventDefault();
    
                $wrap.find('.fs-option').removeClass('hl');
    
                if (window.ySelect.idx > 0) {
                    window.ySelect.idx--;
                    $wrap.find('.fs-option[data-index=' + window.ySelect.idx + ']').addClass('hl');
                    setScroll($wrap);
                }
                else {
                    window.ySelect.idx = -1;
                    $wrap.find('.fs-search input').focus();
                }
            }
            else if (40 == e.which) { // down
                e.preventDefault();
    
                var last_index = $wrap.find('.fs-option:last').attr('data-index');
                if (window.ySelect.idx < parseInt(last_index)) {
                    window.ySelect.idx++;
                    $wrap.find('.fs-option').removeClass('hl');
                    $wrap.find('.fs-option[data-index=' + window.ySelect.idx + ']').addClass('hl');
                    setScroll($wrap);
                }
            }
            else if (32 == e.which || 13 == e.which) { // space, enter
                $wrap.find('.fs-option.hl').click();
            }
            else if (27 == e.which) { // esc
                $('.fs-dropdown').addClass('hidden');
                window.ySelect.active = null;
            }
        });
    
        //update by ycx,for this plugin to get selected values
        $.fn.ySelectedValues = function (splitString) {
            var result = "";
            var $selects = this.find("option:selected");
            for (var i = 0; i < $selects.length; i++) {
                result += $selects[i].value + ((i == $selects.length - 1) ? "" : splitString);
            }
            return result;
        }
        $.fn.ySelectedTexts = function (splitString) {
            var result = "";
            var $selects = this.find("option:selected");
            for (var i = 0; i < $selects.length; i++) {
                result += $selects[i].text + ((i == $selects.length - 1) ? "" : splitString);
            }
            return result;
        }
    
    })(jQuery);
    View Code

    3、调用

     var set_ySelect;
            $(function () {
                var $that = $;
                set_ySelect= function (classname,changeBack,isCheck) {
                    $that("." + classname).ySelect({
                        numDisplayed: 10,
                        changeBack: changeBack,
                        isCheck,isCheck
                    });
                }
            })

           //员工角色ajax
                scope.GetRoleInfoAll = function () {
                    Ajax.post("/SysBase/Staff/RoleInfoAll", null, function (result) {
                        scope.RoleInfoAll = [];
                        if (result.Data != null && result.Data.length > 0) {

                            var options = "";
                            var rolds = scope.StaffInfo.RoleId.split(',');//之前保存的角色id

                            //在获取数据后才执行ySelect,并且不能用ng-repeat绑定下拉框数据
                            angular.forEach(result.Data, function (v) {
                                scope.RoleInfoAll.push(v);
                                //设置selected后自动选中
                                options += "<option value='" + v.RoleId + "' "+(rolds.indexOf(v.RoleId+"")>-1?'selected="true"':'')+">" + v.RoleName + "</option>";
                            });
                            $(".RoleInfoAll").append(options);
                            
                            set_ySelect("RoleInfoAll", function (texts, values) {
                                scope.StaffInfo.RoleName = texts;//返回的texts名字是逗号隔开
                                //返回的id值是数组values
                                scope.StaffInfo.RoleId = "";
                                if (values.length > 0) {
                                    scope.StaffInfo.RoleId = values.join(",");
                                }
                            });
                        }
                    });
                }

  • 相关阅读:
    centos 中遇到了pcap.h没有那个文件或者目录
    linux中mysql密码修改
    httpd服务器正常,index.html访问不了
    linux 中防火墙的关闭
    Linux下面如何用命令进行配置网络
    Linux普通用户权限修改
    Linux系统的安装和网络配置
    js 继承
    鼠标点击按钮控制图片移动或者键盘控制图片移动(解决问题:parseInt失效问题,用Number)
    冒泡排序+二分查找
  • 原文地址:https://www.cnblogs.com/lanofsky/p/14035374.html
Copyright © 2011-2022 走看看