前言:前端项目用的easyui,要实现下拉框多选,带有复选框全选全不选功能,可奈何easyui combobox原来就没有复选框Σ( ° △ °|||)︴,百度一堆文章实现的也都缺胳膊少腿的,用到的方法如getEl(target, value)
,在我这项目里也不能用,然后就有了这篇文章,是通用实现,而且功能实现的相对完整。
先放效果图:
当选中全选的时候勾选所有选项,取消选中全选的时候则取消勾选所有选项,而且实现了选项1到选项6只要有一个是非选中状态,那全选就不会是选中状态。
下面是具体实现代码:
页面代码
<input id="ttt" name="ttt" class="easyui-combobox">
下面实现复选框功能的js代码
/**
* 带有复选框的easyui下拉框工具方法
* @param _id input标签的id
* @param optionsJson json字符串,定义选项的内容,
* 例子:
* [
* {id: '对应于option标签的value', text: '页面显示文本'}
* ]
* @param hight 下拉框高度
*/
function combobox_checkbox(_id, optionsJson, hight) {
$('#'+_id).combobox({
data: optionsJson,
valueField: 'id',
textField: 'text',
panelHeight: hight,
multiple: true,
editable: false,
formatter: function (row) { // formatter方法就是实现了在每个下拉选项前面增加checkbox框的方法
var opts = $(this).combobox('options');
return '<input type="checkbox" class="combobox-checkbox">' + row[opts.textField]
},
onLoadSuccess: function () { // 下拉框数据加载成功调用
// 正常情况下是默认选中“所有”,但我想实现点击所有全选功能,这这样会冲突,暂时默认都不选
$("#"+_id).combobox('clear'); //清空
// var opts = $(this).combobox('options');
// var values = $('#'+_id).combobox('getValues');
// $.map(opts.data, function (opt) {
// if (opt.id === '') { // 将"所有"的复选框勾选
// $('#'+opt.domId + ' input[type="checkbox"]').prop("checked", true);
// }
// });
},
onSelect: function (row) { // 选中一个选项时调用
var opts = $(this).combobox('options');
//当点击所有时,则勾中所有的选项
if (row.text === "全选") {
var data = $("#"+_id).combobox('getData');
for (var i = 0; i < data.length; i++) {
$('#'+data[i].domId + ' input[type="checkbox"]').prop("checked", true);
}
var list = [];
$.map(opts.data, function (opt) {
list.push(opt.id);
});
$("#"+_id).combobox('setValues', list); // combobox全选
} else {
//设置选中选项所对应的复选框为选中状态
$('#'+row.domId + ' input[type="checkbox"]').prop("checked", true);
}
},
onUnselect: function (row) { // 取消选中一个选项时调用
var opts = $(this).combobox('options');
// 当取消全选勾中时,则取消所有的勾选
if (row.text === "全选") {
var a = $("#"+_id).combobox('getData');
for (var i = 0; i < a.length; i++) {
$('#'+a[i].domId + ' input[type="checkbox"]').prop("checked", false);
}
$("#"+_id).combobox('clear');//清空选中项
} else {
// 下面是实现全选状态下取消任何一项,则取消勾选所有
//设置选中选项所对应的复选框为非选中状态
$('#'+row.domId + ' input[type="checkbox"]').prop("checked", false);
var selectedList = $("#"+_id).combobox('getValues');
// 如果“所有”是选中状态,则将其取消选中
if (selectedList[0] === "") {
// 将“所有”选项移出数组,并且将该项的复选框设为非选中
selectedList.splice(0, 1);
$('#'+opts.data[0].domId + ' input[type="checkbox"]').prop("checked", false);
}
$("#"+_id).combobox('clear');//清空
$("#"+_id).combobox('setValues', selectedList); // 重新复制选中项
}
}
});
}
调用上面的工具方法即可,调用代码如下
var tttData = [
{id: '', text: '全选'},
{id: '1', text: '选项1'},
{id: '2', text: '选项2'},
{id: '3', text: '选项3'},
{id: '4', text: '选项4'},
{id: '5', text: '选项5'},
{id: '6', text: '选项6'},
];
combobox_checkbox('ttt', tttData, 'auto');
上面是所有的实现,有不足的还请指出。
为方便大家测试,下面给出完整的html代码,可以直接拷贝保存成html文件在浏览器运行,我没找到jquery和easyui的可用cdn,要手动jquery和easyui的核心包放在同级目录下。
<html>
<head>
<!-- 引入jquery和easyui -->
<script type="text/javascript" src="jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="jquery.easyui.min.js"></script>
</head>
<body class="easyui-layout">
复选框演示:<input id="ttt" name="ttt" class="easyui-combobox">
<a href="javascript:;" onclick="getSearchParams()">获取选中的值</a>
</body>
<script type="text/javascript">
$(function () {
// 设置地市多选下拉框内容
setCityData();
});
/**
* 获取选中的值
*/
function getSearchParams() {
var cityIn = $('#ttt').combobox('getValues');
if (cityIn[0] === '') { // 去除首位空格
cityIn.splice(0, 1);
}
console.log(cityIn);
alert(cityIn);
}
/**
* 设置地市多选内容
*/
function setCityData() {
var tttData = [
{id: '', text: '全选'},
{id: '1', text: '选项1'},
{id: '2', text: '选项2'},
{id: '3', text: '选项3'},
{id: '4', text: '选项4'},
{id: '5', text: '选项5'},
{id: '6', text: '选项6'},
];
combobox_checkbox('ttt', tttData, 'auto');
}
/**
* 带有复选框的easyui下拉框
* @param _id input标签的id
* @param optionsJson json字符串,定义选项的内容,
* 例子:
* [
* {id: '对应于option标签的value', text: '页面显示文本'}
* ]
* @param hight 下拉框高度
*/
function combobox_checkbox(_id, optionsJson, hight) {
$('#'+_id).combobox({
data: optionsJson,
valueField:'id',
textField:'text',
panelHeight:hight,
multiple:true,
editable:false,
formatter: function (row) { // formatter方法就是实现了在每个下拉选项前面增加checkbox框的方法
var opts = $(this).combobox('options');
return '<input type="checkbox" class="combobox-checkbox">' + row[opts.textField]
},
onLoadSuccess: function () { // 下拉框数据加载成功调用
// 正常情况下是默认选中“所有”,但我想实现点击所有全选功能,这这样会冲突,暂时默认都不选
$("#"+_id).combobox('clear'); //清空
// var opts = $(this).combobox('options');
// var values = $('#'+_id).combobox('getValues');
// $.map(opts.data, function (opt) {
// if (opt.id === '') { // 将"所有"的复选框勾选
// $('#'+opt.domId + ' input[type="checkbox"]').prop("checked", true);
// }
// });
},
onSelect: function (row) { // 选中一个选项时调用
var opts = $(this).combobox('options');
//当点击所有时,则勾中所有的选项
if (row.text === "全选") {
var data = $("#"+_id).combobox('getData');
for (var i = 0; i < data.length; i++) {
$('#'+data[i].domId + ' input[type="checkbox"]').prop("checked", true);
}
var list = [];
$.map(opts.data, function (opt) {
list.push(opt.id);
});
$("#"+_id).combobox('setValues', list); // combobox全选
} else {
//设置选中选项所对应的复选框为选中状态
$('#'+row.domId + ' input[type="checkbox"]').prop("checked", true);
}
},
onUnselect: function (row) { // 取消选中一个选项时调用
var opts = $(this).combobox('options');
// 当取消全选勾中时,则取消所有的勾选
if (row.text === "全选") {
var a = $("#"+_id).combobox('getData');
for (var i = 0; i < a.length; i++) {
$('#'+a[i].domId + ' input[type="checkbox"]').prop("checked", false);
}
$("#"+_id).combobox('clear');//清空选中项
} else {
// 下面是实现全选状态下取消任何一项,则取消勾选所有
//设置选中选项所对应的复选框为非选中状态
$('#'+row.domId + ' input[type="checkbox"]').prop("checked", false);
var selectedList = $("#"+_id).combobox('getValues');
// 如果“所有”是选中状态,则将其取消选中
if (selectedList[0] === "") {
// 将“所有”选项移出数组,并且将该项的复选框设为非选中
selectedList.splice(0, 1);
$('#'+opts.data[0].domId + ' input[type="checkbox"]').prop("checked", false);
}
$("#"+_id).combobox('clear');//清空
$("#"+_id).combobox('setValues', selectedList); // 重新复制选中项
}
}
});
}
</script>
</html>
网友评论