Select2是一个用于优化下拉列表和输入框的jQuery插件,它提供了很多功能强大的选项,可以使用户选择更加快捷方便,本文将从多个方面为大家详细阐述Select2的应用以及相关问题的解决。
一、基本介绍
Select2可以被用来代替HTML的select元素,或者同普通的input元素一起使用。它可以根据输入内容来动态地加载选项,并且提供多选、搜索、标签和自定义渲染等功能。
下面是一个简单的Select2实例:
<select class="js-example-basic-single" name="state">
<option value="AL">Alabama</option>
<option value="WY">Wyoming</option>
</select>
<script>
$(document).ready(function() {
$('.js-example-basic-single').select2();
});
</script>
在这个例子中,我们只需要引入Select2的CSS和JS,并在需要代替的select元素上添加类名"js-example-basic-single",在script标签中调用Select2即可进行替换。
二、选项加载
有时候我们需要动态地加载下拉框的选项,Select2提供了三种方式进行选项加载:静态数组、AJAX请求和函数。
1、静态数组
静态数组是一种简单的方式,我们可以在HTML中以<option>标签的形式定义选项,然后再将这个select元素应用到Select2上。如果我们想添加静态选项,只需要修改HTML即可。
<select class="js-example-array">
<option value="AL">Alabama</option>
<option value="WY">Wyoming</option>
</select>
<script>
$(document).ready(function() {
var data = [
{id: 0, text: 'enhancement'},
{id: 1, text: 'bug'},
{id: 2, text: 'duplicate'},
{id: 3, text: 'invalid'},
{id: 4, text: 'wontfix'}
];
$(".js-example-array").select2({
data: data
});
});
</script>
在这个例子中,我们直接在JS中定义了一个数组,然后将其作为参数传递给Select2。由于option标签中的"value"属性已经和JavaScript数组对象中的"id"属性类似,因此在data数组中也只使用"id"和"text"两个值对选项进行定义。
2、Ajax请求
如果数据量比较大的话,我们通常采用Ajax请求的方式进行列表展示。它可以进行远程搜索、远程选项添加以及显示结果集等功能,形式与静态数组非常相似。
<select class="js-data-example-ajax">
<option value="3620194" selected="selected">select2/select2</option>
</select>
<script>
$(document).ready(function() {
function formatRepo(repo) {
if (repo.loading) return repo.text;
var markup = "<div class='select2-result-repository clearfix'>" +
"<div class='select2-result-repository__avatar'>" +
" <img class='select2-result-repository__avatar-img' src='" + repo.owner.avatar_url + "' />" +
"</div>" +
"<div class='select2-result-repository__meta'>" +
" <div class='select2-result-repository__title'>" +
" " + repo.full_name +
" </div>";
if (repo.description) {
markup += "<div class='select2-result-repository__description'>" + repo.description + "</div>";
}
markup += "<div class='select2-result-repository__statistics'>" +
" <div class='select2-result-repository__forks'>" +
" <i class='fa fa-flash'></i> " + repo.stargazers_count +
" </div>" +
" <div class='select2-result-repository__stargazers'>" +
" <i class='fa fa-star'></i> " + repo.watchers_count +
" </div>" +
" <div class='select2-result-repository__contributors'>" +
" <i class='fa fa-user'></i> " + repo.forks_count +
" </div>" +
"</div>" +
"</div></div>";
return markup;
}
function formatRepoSelection(repo) {
return repo.full_name || repo.text;
}
$(".js-data-example-ajax").select2({
ajax: {
url: "https://api.github.com/search/repositories",
dataType: 'json',
delay: 250,
data: function(params) {
return {
q: params.term,
page: params.page
};
},
processResults: function(data, params) {
params.page = params.page || 1;
return {
results: data.items,
pagination: {
more: (params.page * 30) < data.total_count
}
};
},
cache: true
},
escapeMarkup: function(markup) {
return markup;
},
minimumInputLength: 1,
templateResult: formatRepo,
templateSelection: formatRepoSelection
});
});
</script>
3、函数。
当我们需要动态生成选项时,可以使用JavaScript函数来覆盖默认的Ajax加载过程。这需要我们在初始化时将一个函数传入"processResults"属性中。
<select id="example-plugin"></select>
<script>
$(document).ready(function() {
function getResult() {
return $([
{id:"1", text:"第一项"},
{id:"2", text:"第二项"},
{id:"3", text:"第三项"}
]);
}
$("#example-plugin").select2({
ajax:{
processResults:function(){ }
},
tags:true,
createTag:function(){return null;}
}).append(getResult());
});
</script>
三、多选功能
Select2提供了多选功能,不像HTML select,Select2允许用户可以在一个输入框中选择多个值,选中的值会以标签的形式展现。
<select class="js-example-basic-multiple js-states form-control" multiple="multiple">
<option value="AL">Alabama</option>
<option value="WY">Wyoming</option>
</select>
<script>
$(document).ready(function() {
$('.js-example-basic-multiple').select2();
});
</script>
如果需要对选中项进行一些操作,比如求和、统计个数等,可以使用以下代码:
$('#案件所在区域, #涉案地点').on('change', function() {
var caseRegions = $('#案件所在区域').val() || [];
var locations = $('#涉案地点').val() || [];
var count = caseRegions.length + locations.length;
$('#count').text(count.toString());
});
这段代码监听select列表的变化, 当选中的值发生变化时,获取选中项的长度并进行相应操作。
四、搜索功能
Select2可以根据用户的输入来动态地加载选项,这也意味着它可以作为一个搜索框来使用。
下面我们创造一个实例,根据搜索结果展示电影海报:
<input type="text" name="q" class="form-control js-data-example-ajax" />
<script>
$(document).ready(function() {
function formatRepo(movie) {
if (movie.loading) return movie.text;
var $container = $(
"<div class='select2-result-repository clearfix'>" +
"<div class='select2-result-repository__avatar'></div>" +
"<div class='select2-result-repository__meta'></div>" +
"<div class='select2-result-repository__description'></div>" +
"</div>"
);
$container.find(".select2-result-repository__avatar").append("<img src='" + movie.url + "' />");
$container.find(".select2-result-repository__meta").append("<div class='select2-result-repository__title'>" + movie.title + "</div>");
$container.find(".select2-result-repository__description").append(movie.plot);
return $container;
}
function formatRepoSelection(movie) {
return movie.title || movie.text;
}
$(".js-data-example-ajax").select2({
ajax: {
url: "https://www.omdbapi.com/",
dataType: 'json',
delay: 250,
data: function(params) {
return {
q: params.term + '*',
page: params.page
};
},
processResults: function(data, params) {
params.page = params.page || 1;
return {
results: data.Search,
pagination: {
more: (params.page * 10) < data.totalResults
}
};
},
cache: true
},
escapeMarkup: function(markup) {
return markup;
},
minimumInputLength: 1,
templateResult: formatRepo,
templateSelection: formatRepoSelection
});
});
</script>
注意,这个例子中,我们使用了一个API接口去获取电影海报,如果需要使用,请保持请求速度,不然会一直载入。
五、标签
标签是Select2中一种强大的机制,它可以从输入框中获得多个单一的值,并根据这些值创建标签,原生的HTML中并不支持标签,所以这是一个很好的补充。
代码如下:
<select class="js-example-basic-multiple" name="states[]" multiple="multiple">
<option value="AL">Alabama</option>
<option value="WY">Wyoming</option>
</select>
<script>
$(document).ready(function() {
$('.js-example-basic-multiple').select2({
tags: true
});
});
</script>
在这个例子中,只需要添加"tags: true"选项就可以实现标签的功能。
六、自定义渲染
Select2默认渲染效果不是非常好看,如果我们需要改变样式,可以为每一个选项提供自定义渲染。
<select id="e6" style="width:300px;">
<option value="o1">Option one</option>
<option value="o2">Option two</option>
<option value="o3">Option three</option>
</select>
<script type="text/javascript">
var newOption = new Option("New text", "new