基于 select2 插件的自做效果

  select2插件很好用,但是样式在其基础上改了又改都觉得不好。。。于是选择只使用它的展示框,而不使用它的下拉框,自己写一个列表来配合使用,下图为修改后的样子:

  选择的样子:

  限制选择个数的样子:

  下面说说思路:

1、使用 $(".select").on("select2:opening", function (e) {return false;}) 来阻止下拉框的弹出事件。

2、然后我们自己写一个列表,这里我用的是 angular ,直接 repeat 出来的列表,高效好用。

3、展示框只有取消选中操作,所以通过 unselect 事件来监听它的值的改变。

4、列表绑定点击事件,通过判断当前节点的选中与否,进行选中取消选中。

5、取消选中这里需要注意一下,因为貌似 select2 没有相关取消一个节点选中的 api ,所以这个实现的思路就是选中的数组中移除要取消的选中项,然后将剩余项重新设置选中。

接着是万众期待的环节:

  引入依赖文件

<script src=‘angular.js‘></script>
<script src=‘jquery-1.11.3.js‘></script>
<script src="select2.js"></script>
<link rel="stylesheet" href="select2.css">

  自己做的样式:

<style>
div.selectList {
    width: 50%;
    margin: auto;
}
div.selectList ul {
    list-style: none;
    padding: 0px;
}
div.selectList li {
    display: inline-block;
    margin: 3px;
    padding:3px 5px;
    background-color: #ddd;
    border: 1px solid #aaa;
    border-radius: 4px;
}
div.selectList a {
    cursor: pointer;
}
div.selectList .selected {
    background: #63a855;
    border: #63a800 solid 1px;
    color: #fff;
}
div.selectList a:hover {
    text-decoration: underline;
}
.box {
    text-align: center;
    margin-top:30px;
}
.box .select2-container--default .select2-selection--multiple .select2-selection__choice {
    background-color: #fff;
    border: 1px solid #aaa;
}
.box .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
    color: #fff;
    border: 1px solid #ccc;
    background: #ccc;
    border-radius: 9px;
    float: right;
    font-size: 12px;
    margin-left: 4px;
    margin-top: 1px;
}
.box .select2-container--default .select2-results__option[aria-selected=true] {
    background-color: #eee;
}
.box .select2-container--default .select2-selection--multiple .select2-selection__clear {
    position: absolute;
    display: inline-block;
    right: 0;
    margin: 0;
}
<style>

  创建的指令:

 .directive(‘multipleSelectInput‘, function ($parse) {
            return {
                restrict: ‘EA‘,
                template: "<div class=‘box‘><select style=‘width: 50%‘ id=‘selectInput‘></select></div>" +
                    "<div class=‘selectList‘><ul>" +
                    "<li ng-repeat=‘obj in showList‘ ng-class=‘" + ‘{"selected"‘ + ":isSelected(obj)}‘>" +
                    ‘<a ng-click="changeSelect(obj)">{{obj.text}}</a>‘ +
                    ‘<input type="checkbox" ng-click="changeSelect(obj)" ng-checked="obj.selected" ng-disabled="!obj.selected && !canNotSelected">‘ +
                    "</li></ul></div>",
                scope: {
                    selectedList: ‘=‘,
                    maxNodes: ‘=‘
                },
                link: function ($scope, elem, attrs, ngModel) {
                    attrs.$observe(‘multipleSelectInput‘, function (key) {
//                        console.log(key);
                        if (key.length != 0) {
                            start(key);
                        }
                    });
                    function start(data) {
                        //下方展示扩展词列表
                        $scope.showList = angular.fromJson(data);
                        //存储选中的节点数组
                        $scope.selectedList = [];
                        //checkbox 是否能选择
                        $scope.canNotSelected = true;
                        //目标元素
                        var $eventSelect = $("#selectInput");
                        //初始化
                        $eventSelect.select2({
                            data: angular.fromJson(data),
                            placeholder: ‘请选择‘,
                            allowClear: true,
                            multiple: true
                        });
                        //禁掉下拉框打开,自带效果与需求不符,自己写列表
                        $eventSelect.on("select2:opening", function (e) { console.log(‘open‘); return false;});
                        //监听取消选中
                        $eventSelect.on("select2:unselect", function (e) {
                            $scope.$apply(function() {
                                $scope.getSelected();

                                //删除选中节点的信息
                                var data = e.params.data;
//                                console.log(data);
                                angular.forEach( $scope.showList, function (obj) {
                                    if(obj.id == data.id) {
                                        obj.selected = false;
                                    }
                                })
                            })
                        });

                        $scope.isSelected = function(obj) {
                            if(obj.selected) {
                                return true;
                            }
                            return false;
                        };

                        $scope.changeSelect = function (obj) {
                            //预先判断,如果临近最大限制,那么此次执行点击选中后会到大限制,那么将其余项的 checkbox 置 disabled
                            if(!obj.selected && $scope.selectedList.length >= $scope.maxNodes - 1) {
                                $scope.canNotSelected = false;
                            } else {
                                $scope.canNotSelected = true;
                            }
                            //判断限制最大个数
                            if(!obj.selected && $scope.selectedList.length >= $scope.maxNodes) {
                                console.log(‘max length : ‘ + $scope.maxNodes);
                                return;
                            }
                            if(obj.selected) {
                                obj.selected = false;
                                //取消选中,从数组中移除对应节点
//                                console.log($scope.selectedList);
                                angular.forEach($scope.selectedList, function (data, i) {
                                    if(obj.id == data.id) {
                                        $scope.selectedList.splice(i, 1);
                                        $scope.inputSelectedFnc($scope.selectedList);
                                        return;
                                    }
                                });
                            } else {
                                obj.selected = true;
                                //选中则压入数组进行设置选中
                                $scope.selectedList.push(obj);
                                $scope.inputSelectedFnc($scope.selectedList);
                            }
                        };

                        // 设置选中
                        $scope.inputSelectedFnc = function (arr) {
                            var initSelectArr = [];
                            for(var i = 0; i < arr.length; i ++) {
                                initSelectArr.push(arr[i].id);
                            }
                            $eventSelect.val(initSelectArr).trigger(‘change‘);
                        };
                        //初始化选中项
                        //$scope.inputSelectedFnc(angular.fromJson(data));

                        //获取选中项
                        $scope.getSelected = function () {
                            $scope.selectedList = $eventSelect.select2("data");
//                            console.log($scope.selectedList);
                        }
                    }
                }
            }
        })

  数据结构:

  id 是不能重复的,text 是文本信息,selected 为列表判断是否选中标记,其余不重要。

$scope.list = [
                { id: 0, text: ‘red red red‘, color: ‘red‘, selected: false},
                { id: 1, text: ‘blue blue blue‘, color: ‘blue‘, selected: false},
                { id: 2, text: ‘yellow yellow yellow‘, color: ‘yellow‘, selected: false},
                { id: 3, text: ‘black black black‘, color: ‘black‘, selected: false},
                { id: 4, text: ‘purple purple purple‘, color: ‘purple‘, selected: false},
                { id: 5, text: ‘white white white‘, color: ‘white‘, selected: false},
                { id: 6, text: ‘gray gray gray‘, color: ‘gray‘, selected: false},
                { id: 7, text: ‘brown brown brown‘, color: ‘brown‘, selected: false},
                { id: 8, text: ‘green green green‘, color: ‘green‘, selected: false},
                { id: 9, text: ‘orange orange orange‘, color: ‘orange‘, selected: false},
                { id: 10, text: ‘red red red‘, color: ‘red‘, selected: false},
                { id: 11, text: ‘blue blue blue‘, color: ‘blue‘, selected: false},
                { id: 12, text: ‘yellow yellow yellow‘, color: ‘yellow‘, selected: false},
                { id: 13, text: ‘black black black‘, color: ‘black‘, selected: false},
                { id: 14, text: ‘purple purple purple‘, color: ‘purple‘, selected: false},
                { id: 15, text: ‘white white white‘, color: ‘white‘, selected: false},
                { id: 16, text: ‘gray gray gray‘, color: ‘gray‘, selected: false},
                { id: 17, text: ‘brown brown brown‘, color: ‘brown‘, selected: false},
                { id: 18, text: ‘green green green‘, color: ‘green‘, selected: false},
                { id: 19, text: ‘orange orange orange‘, color: ‘orange‘, selected: false}
            ];

  指令调用方法:

<div multiple-select-input="{{list}}" selected-list="selectedList" max-nodes=‘3‘></div>

  获取选中数据方法:

<button ng-click="get(selectedList)">get information</button>
<script>
$scope.get = function (data) {
    console.log(data);
}
</script>
时间: 2024-09-28 04:18:07

基于 select2 插件的自做效果的相关文章

基于tomcat插件的maven多模块工程热部署

内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? 1. 基于maven拆分模块后,热部署的效果不好,经常出故障. 2. 对于多个子web工程,不能做到任意一个web工程都可以放到tomcat里运行,要在外面搞个壳子组合多个工程. 于是,有了这纠结的一周,也有了此文. 本文关于什么 如标题所言,本文涉及到如下几个内容: 1. maven多模块工程 2

基于Lua插件化的Pcap流量监听代理

1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的输入数据流.我们如果不在IDS上看应用的服务,可以直接针对服务所在服务位置,针对应用端口进行,有针对性的监听分析. Tshark和tcpdump.windump这些监听工具提供了比较丰富的命令行参数来监听流量数据.wireshark.burpsuite这些工具也提供相应的lua.python脚本的机

Metronic_下拉列表Select2插件的使用

这个插件是基于Select的扩展插件,能够提供更加丰富的功能和用户体验,它的github官网地址为:https://select2.github.io/,具体的使用案例,可以参考地址:https://select2.github.io/examples.html. 我们在整个框架里面,用到了很多Select2控件来处理内容的显示,包括单选的下拉列表(包括级联选择框).复选的下拉列表.树形下拉列表等方式,界面效果如下所示. 1)编辑界面下的省份.城市.所在行政区的级联界面效果,选择省份,会加载对应

基于maven插件的缓存控制插件

asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控制工具,通过修改资源url的请求参数,比如在url后面添加版本号或者时间戳的形式,来有效的防止浏览器缓存. 目前该功能可用于避免js.css.image 三种文件类型缓存 用法: 1.添加插件asset-cache-control 到pom文件中: <build> <plugins>

基于Jquery插件Uploadify实现实时显示进度条上传图片

网址:http://www.jb51.net/article/83811.htm 这篇文章主要介绍了基于Jquery插件Uploadify实现实时显示进度条上传图片的相关资料,感兴趣的小伙伴们可以参考一下 先了解了解Uploadify,具体内容如下 Uploadify是一个简单易用的多文件上传方案.作为一个Jquery插件,Uploadify使用简单,并具有高度的定制性. Uploadify特性: Uploadify简单说来,是基于Jquery的一款文件上传插件.它的功能特色总结如下: 1).支

select2插件的使用

前段时间用select2插件做了可选择可编辑的功能,一直没写笔记,今天又用到了写一下笔记,方便以后使用. 就以现在select2的新版本为准把 一.文件需要引入select2.full.js.select2.min.css(4.0.1版本)和jquery.1.11.1 最新版本的select2如果引用的jquery版本较低的话,某些功能无法正常使用.比如:清除功能 allowClear : true 最新版本请使用<select></select>标签 二.placeholder

struts2基于Convention插件的约定映射使用

一.首先说明一点:所谓的基于Convention插件的约定优于配置的使用,并不是严格意义上的零配置,struts.xml文件并不能完全舍弃. 获得Convention插件功能,所必需的jar包有:|asm-x.x.jar|asm-commons-x.x.jar|struts2-convention-plugin-x.x.jar| 如果将struts2-config-browser-plugin-x.x.jar放入项目中,则可以通过http://{ip}:{port}/{Application}/

一种基于动态插件系统的移动测试黑科技

百度MTC是业界领先的移动应用测试服务平台,为广大开发者在移动应用测试中面临的成本.技术和效率问题提供解决方案.同时分享行业领先的百度技术,作者来自百度员工和业界领袖等. 本文作者:hyxbiao && tony xin 背景 移动APP插件化是平台化产品解决系统限制(65535).模块解耦.和多团队协作的利器.它的最大特点是模块动态下发,给产品带来的收益显而易见,但是,在百度,这套系统给移动端测试技术带来了新思路 移动端线上问题定位的几个场景: 场景一: 云端用户反馈某功能不可用,RD猜

基于Rebound制造绚丽的动画效果-入门篇

基于Rebound制造绚丽的动画效果-入门篇 Rebound是什么? Rebound是一个来自 Facebook 公司的 Java物理和动画库.Rebound spring 模型可用于创建动画,让你感觉很自然. Rebound的运作原理是什么? Rebound拥有两个参数:tension.friction. tension是张力,拉力. friction是摩擦力. 演示: tension:50,friction:1 rebound_t50_f1.gif 拉力为50时,摩擦为1.摩擦对拉力的损耗十