学习使用bootstrap实现下拉列表多选组件

188 篇文章 1 订阅
8 篇文章 0 订阅

一、组件开源地址以及API说明

bootstrap-select开源地址:https://github.com/silviomoreto/bootstrap-select

bootstrap-select使用示例:http://silviomoreto.github.io/bootstrap-select/examples/

bootstrap-select文档说明:http://silviomoreto.github.io/bootstrap-select/options/

二、组件效果示例

1、单选效果

在这里插入图片描述

2、多选效果

在这里插入图片描述

3、配置搜索功能

在这里插入图片描述

4、分组选中

在这里插入图片描述

5、设置最多选中项为2个

在这里插入图片描述

6、自定义说明Title

比如我们定义为“请选择省份”

在这里插入图片描述

7、某些情况下如果多选的数量比较多

我们可以显示“缩略模式”。比如当选择了两项以上的时候

在这里插入图片描述

8、自定义样式

在这里插入图片描述
在这里插入图片描述

9、显示图标加文字

在这里插入图片描述

10、显示带颜色的标签

在这里插入图片描述
在这里插入图片描述

11、展开最多显示可配置的个数

不如最多显示3项

在这里插入图片描述

12、全选和反选

在这里插入图片描述
以上都是些常用功能,更多效果可以查看官方示例!

三、使用示例

1、基础示例

既然是bootstrap-select,组件肯定是依赖bootstrap的,而bootstrap又是依赖jquery的,所以使用组件必须引用如下文件。

<link href="Content/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<link href="Content/bootstrap-select/css/bootstrap-select.min.css" rel="stylesheet" />

<script src="Content/jquery-1.9.1.min.js"></script>
<script src="Content/bootstrap/js/bootstrap.min.js"></script>
<script src="Content/bootstrap-select/js/bootstrap-select.min.js"></script>
<script src="Content/bootstrap-select/js/i18n/defaults-zh_CN.min.js"></script>

最后一个文件 defaults-zh_CN.min.js 非必需,是组件中文化的时候才需要引用。

使用就更加简单了,不用任何已经js,直接使用class就可以初始化。

<select class="selectpicker">
    <option value="1">广东省</option>
    <option value="2">广西省</option>
    <option value="3">福建省</option>
    <option value="4">湖南省</option>
    <option value="5">山东省</option>                            
</select>

给一个select标签加上selectpicker样式即可。

多选就不用多说了

<select class="selectpicker" multiple>
    <option value="1">广东省</option>
    <option value="2">广西省</option>
    <option value="3">福建省</option>
    <option value="4">湖南省</option>
    <option value="5">山东省</option>                            
</select>

2、其他效果示例

上面是最简单的使用,下面就将一些常用的效果给出代码示例,高手请直接跳过此段。

2.1给组件加搜索功能

<select class="selectpicker" multiple data-live-search="true">
    <option value="1">广东省</option>
    <option value="2">广西省</option>
    <option value="3">福建省</option>
    <option value="4">湖南省</option>
    <option value="5">山东省</option>                            
</select>

2.2选项分组

<select class="form-control selectpicker" data-live-search="true" multiple>
        <optgroup label="广东省">
                <option value="1">广州市</option>
                <option value="2">深圳市</option>
                <option value="3">珠海市</option>
         </optgroup>   
          <optgroup label="广西">
                  <option value="1">南宁市</option>
                  <option value="2">柳州</option>
                  <option value="3">桂林市</option>
           </optgroup>  
           <optgroup label="山东">
                   <option value="1">烟台</option>
                   <option value="2">青岛</option>
                   <option value="3">济南</option>
             </optgroup>                          
</select>

2.3设置最多选中项为2个

<select class="selectpicker" multiple data-live-search="true" data-max-options="2">
    <option value="1">广东省</option>
    <option value="2">广西省</option>
    <option value="3">福建省</option>
    <option value="4">湖南省</option>
    <option value="5">山东省</option>                            
</select>

2.4缩略模式

比如当选中值大于3个的时候只显示选中项的个数,注意这个属性只对多选生效

<select class="selectpicker" multiple data-live-search="true" data-selected-text-format="count > 3">
    <option value="1">广东省</option>
    <option value="2">广西省</option>
    <option value="3">福建省</option>
    <option value="4">湖南省</option>
    <option value="5">山东省</option>                            
</select>

2.5显示带颜色的标签

<select class="form-control selectpicker" title="请选择省份" multiple>
                        <option data-content="<span class='label label-success'>广东省</span>">广东省</option>    
                        <option data-content="<span class='label label-info'>广西省</span>">广西省</option>  
                        <option data-content="<span class='label label-warning'>福建省</span>">福建省</option>  
                        <option data-content="<span class='label label-danger'>山东省</span>">山东省</option>                        
</select>

默认样式选择

<select class="selectpicker" data-style="btn-primary">
  ...
</select>

<select class="selectpicker" data-style="btn-info">
  ...
</select>

<select class="selectpicker" data-style="btn-success">
  ...
</select>

<select class="selectpicker" data-style="btn-warning">
  ...
</select>

<select class="selectpicker" data-style="btn-danger">
  ...
</select>

在这里插入图片描述

3、组件取值赋值

上面都是组件的初始化的一些东西,一般情况下,我们需要对组件进行取值和赋值,我们应该如何操作呢。

3.1、组件取值

关于组件取值保持原生的jquery方法,比如 var value = $(’#sel’).val(); 这样是不是很简单,需要注意的是,如果是多选,这里得到的value变量是一个数组变量,形如 [‘1’,‘2’,‘3’]。

3.2、组件赋值

组件赋值就需要稍微变换一下了,如果你直接 $(’#sel’).val(‘1’); 这样赋值将会无效,正确的赋值方法为:

$('.selectpicker').selectpicker('val', '1');

在一些级联选择的使用场景中,经常需要在赋值的时候顺便触发一下组件的change事件,我们可以这么做。

$('.selectpicker').selectpicker('val', '1').trigger("change");

如果是多选的赋值,也是一样

$('.selectpicker').selectpicker('val', ['1','2','3']).trigger("change");

4、组件其他用法

全选: $('.selectpicker').selectpicker('selectAll'); 

反选: $('.selectpicker').selectpicker('deselectAll'); 

适应手机模式: $('.selectpicker').selectpicker('mobile'); 

组件禁用:

$('.disable-example').prop('disabled', true);
$('.disable-example').selectpicker('refresh');

组件启用:

$('.disable-example').prop('disabled', false);
$('.disable-example').selectpicker('refresh');

组件销毁:

$('.selectpicker').selectpicker('destroy');

5、组件封装

上面关于组件的初始化介绍了那么多,都是通过class='selectpicker’去做初始化的,很多情况下,我们的select的option都是动态获取,然后再初始化的,于是乎博主仔细寻找api,看里面是否有远程获取数据,很遗憾,组件没有支持这种远程获取数据的方法。没关系,我们自己封装一个ajax请求,然后动态构造option又有多难呢?这里又得提一下原来那篇封装js组件的文章了,我们按照那篇文章的思路封装一个不就好了。以下给出一个参考。

(function ($) {
    //1.定义jquery的扩展方法bootstrapSelect
   $.fn.bootstrapSelect = function (options, param) {
       if (typeof options == 'string') {
           return $.fn.bootstrapSelect.methods[options](this, param);
       }
       //2.将调用时候传过来的参数和default参数合并
       options = $.extend({}, $.fn.bootstrapSelect.defaults, options || {});
       //3.添加默认值
       var target = $(this);
       if (!target.hasClass("selectpicker")) target.addClass("selectpicker");
       target.attr('valuefield', options.valueField);
       target.attr('textfield', options.textField);
       target.empty();
       var option = $('<option></option>');
       option.attr('value', '');
       option.text(options.placeholder);
       target.append(option);
       //4.判断用户传过来的参数列表里面是否包含数据data数据集,如果包含,不用发ajax从后台取,否则否送ajax从后台取数据
       if (options.data) {
           init(target, options.data);
       }
       else {
           //var param = {};
           options.onBeforeLoad.call(target, options.param);
           if (!options.url) return;
           $.getJSON(options.url, options.param, function (data) {
               init(target, data);
           });
       }
       function init(target, data) {
           $.each(data, function (i, item) {
               var option = $('<option></option>');
               option.attr('value', item[options.valueField]);
               option.text(item[options.textField]);
               target.append(option);
           });
           options.onLoadSuccess.call(target);
       }
       target.unbind("change");
       target.on("change", function (e) {
           if (options.onChange)
               return options.onChange(target.val());
       });
   }

   //5.如果传过来的是字符串,代表调用方法。
   $.fn.bootstrapSelect.methods = {
       getValue: function (jq) {
           return jq.val();
       },
       setValue: function (jq, param) {
           jq.val(param);
       },
       load: function (jq, url) {
           $.getJSON(url, function (data) {
               jq.empty();
               var option = $('<option></option>');
               option.attr('value', '');
               option.text('请选择');
               jq.append(option);
               $.each(data, function (i, item) {
                   var option = $('<option></option>');
                   option.attr('value', item[jq.attr('valuefield')]);
                   option.text(item[jq.attr('textfield')]);
                   jq.append(option);
               });
           });
       }
   };

   //6.默认参数列表
   $.fn.bootstrapSelect.defaults = {
       url: null,
       param: null,
       data: null,
       valueField: 'value',
       textField: 'text',
       placeholder: '请选择',
       
   };

   //初始化
   $(".selectpicker").each(function () {
    var target = $(this);
    target.attr("title", $.fn.select.defaults.placeholder);
    target.selectpicker();
});
})(jQuery);

bootstrapSelect

这样封装之后,我们直接使用如下代码即可初始化组件。

$('#sel').bootstrapSelect({
    url:'/a/b',
    data: {},
    valueField: 'value',
    textField: 'text',
});
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bootstrap 的下菜单默认只支持单,如果需要实现,可以借助 JavaScript 实现。以下是一种实现方式: 首先,在 HTML 中定义一个下菜单,给它一个 id: ```html <div class="dropdown"> <button class="btn btn-secondary dropdown-toggle" type="button" id="multiSelectDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 择... </button> <div class="dropdown-menu" aria-labelledby="multiSelectDropdown"> <a class="dropdown-item" href="#" data-value="option1">项1</a> <a class="dropdown-item" href="#" data-value="option2">项2</a> <a class="dropdown-item" href="#" data-value="option3">项3</a> <a class="dropdown-item" href="#" data-value="option4">项4</a> </div> </div> ``` 注意每个项都有一个 `data-value` 属性,用来存储项的值。 然后在 JavaScript 中监听下菜单的点击事件,以实现功能: ```javascript var selectedValues = []; // 存储已中的值 $('.dropdown-menu a').click(function(event) { event.preventDefault(); // 阻止链接的默认行为 var value = $(this).data('value'); if (selectedValues.includes(value)) { // 如果已经中了这个项,则取消中 selectedValues.splice(selectedValues.indexOf(value), 1); $(this).removeClass('active'); } else { // 否则中这个项 selectedValues.push(value); $(this).addClass('active'); } // 更新下菜单的文本 var buttonText = ''; if (selectedValues.length > 0) { buttonText = selectedValues.join(', '); } else { buttonText = '择...'; } $('#multiSelectDropdown').text(buttonText); }); ``` 这段代码中,我们定义了一个 `selectedValues` 数组来存储已中的值。每次点击下菜单中的项时,我们先获取该项的值,然后判断它是否已经被中。如果已经中,则将其从 `selectedValues` 数组中删除,并将该项的样式移除;否则将其添加到 `selectedValues` 数组中,并添加样式表示中状态。最后,我们更新下菜单按钮的文本,显示已中的项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值