初版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.cascader {
height: 40px;
border: 1px solid
box-sizing: border-box;
border-radius: 4px;
margin-top: 20px;
width: 200px;
line-height: 40px;
padding: 0 10px;
}
.eo-cascader-panel {
display: flex;
}
.eo-cascader-panel ul {
width: 200px;
box-sizing: border-box;
color:
border: 1px solid
border-right: none;
position: relative;
}
.eo-cascader-panel ul:last-child {
border-right: 1px solid
}
.eo-cascader-panel ul li {
list-style: none;
cursor: pointer;
padding: 6px 10px;
}
.eo-cascader-panel ul li.active {
background:
color:
}
.eo-cascader-panel ul li:hover {
background:
color:
}
</style>
</head>
<body>
<div class="cascader_warp">
<!-- 级联选择按钮 -->
<div class="cascader">请选择</div>
<!-- 级联选择内容 -->
<div class="eo-cascader-panel"></div>
<!-- 存id的input -->
<input class="my_cascader" type="hidden" />
</div>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
// 数据
var tags = [
{
id: 1,
label: "中部",
children: [
{
id: 2,
label: "山西",
children: [
{
id: 3,
label: "太原",
children: [
{
id: 31,
label: "小店区",
},
{
id: 32,
label: "迎泽区",
},
{
id: "TEST001",
label: "晋源区",
},
],
},
{ id: 4, label: "吕梁" },
],
},
{
id: 5,
label: "北京",
children: [
{ id: 6, label: "通州区" },
{ id: 7, label: "海淀区" },
],
},
],
},
{
id: 8,
label: "西北",
children: [
{
id: 9,
label: "陕西",
children: [
{ id: 10, label: "西安" },
{ id: 11, label: "延安" },
{ id: 21, label: "榆林" },
],
},
{
id: 12,
label: "新疆维吾尔族自治区",
children: [
{ id: 13, label: "乌鲁木齐" },
{ id: 14, label: "克拉玛依" },
],
},
],
},
];
$(document).click(function () {
$(".eo-cascader-panel").hide();
});
// 级联选择器第一级
$(".cascader").click(function (e) {
e.stopPropagation();
$(".eo-cascader-panel").show();
$(".eo-cascader-panel").empty();
$(".eo-cascader-panel").append(
`<ul class="eo-cascader-menu1" data-level="1"></ul>`
);
for (var i = 0; i < tags.length; i++) {
var tempId = tags[i].id;
var tempText = tags[i].label;
var children = JSON.stringify(tags[i].children) || "";
$(".eo-cascader-menu1").append(
`<li data-id="${tempId}" data-index="${i}" data-children=${children}>${tempText}</li>`
);
}
});
handlerCascader(1);
// 级联效果
function handlerCascader(level) {
// li的点击效果
$(".eo-cascader-panel")
.off("click")
.on("click", "li", function (e) {
e.stopPropagation();
$(".eo-cascader-panel li").removeClass("active");
$(this).addClass("active");
$(".cascader").text($(this).text()); // 设置选中文字
$("input.my_cascader").val($(this).data("id")); // 设置选中id
var tempTags1 = $(this).data("children");
var tempLevel = +$(this).parent().data("level") + 1;
if (tempTags1.length) {
$(".eo-cascader-menu-next").remove();
$(".eo-cascader-menu1").after(
`<ul class="eo-cascader-menu-next" data-level="${tempLevel}"></ul>`
);
localStorage.setItem("children", tempTags1.length); // 存储子级
for (var j = 0; j < tempTags1.length; j++) {
var tempId = tempTags1[j].id;
var tempText = tempTags1[j].label;
var children = JSON.stringify(tempTags1[j].children) || "";
$(".eo-cascader-menu-next").append(
`<li data-id="${tempId}" data-index="${j}" data-children=${children}>${tempText}</li>`
);
}
}
// 递归调用下一级
handlerCascader(level + 1);
});
var tempChildren = localStorage.getItem("children");
if (!tempChildren) {
return;
}
}
</script>
</body>
</html>
优化版本
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.cascader {
height: 40px;
border: 1px solid
box-sizing: border-box;
border-radius: 4px;
margin-top: 20px;
width: 200px;
line-height: 40px;
padding: 0 10px;
}
.eo-cascader-panel {
display: flex;
}
.eo-cascader-panel ul {
width: 200px;
box-sizing: border-box;
color:
border: 1px solid
border-right: none;
position: relative;
}
.eo-cascader-panel ul:last-child {
border-right: 1px solid
}
.eo-cascader-panel ul li {
list-style: none;
cursor: pointer;
padding: 6px 10px;
}
.eo-cascader-panel ul li.active {
background:
color:
}
.eo-cascader-panel ul li:hover {
background:
color:
}
</style>
</head>
<body>
<div class="cascader_warp">
<!-- 级联选择按钮 -->
<div class="cascader">请选择</div>
<!-- 级联选择内容 -->
<div class="eo-cascader-panel"></div>
<!-- 存id的input -->
<input class="my_cascader" type="hidden" />
</div>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
// 数据
var tags = [
{
id: 1,
label: "中部",
children: [
{
id: 2,
label: "山西",
children: [
{
id: 3,
label: "太原",
children: [
{
id: 31,
label: "小店区",
},
{
id: 32,
label: "迎泽区",
},
{
id: "TEST001",
label: "晋源区",
},
],
},
{ id: 4, label: "吕梁" },
],
},
{
id: 5,
label: "北京",
children: [
{ id: 6, label: "通州区" },
{ id: 7, label: "海淀区" },
],
},
],
},
{
id: 8,
label: "西北",
children: [
{
id: 9,
label: "陕西",
children: [
{ id: 10, label: "西安" },
{ id: 11, label: "延安" },
{ id: 21, label: "榆林" },
],
},
{
id: 12,
label: "新疆维吾尔族自治区",
children: [
{ id: 13, label: "乌鲁木齐" },
{ id: 14, label: "克拉玛依" },
],
},
],
},
];
$(document).click(function () {
$(".eo-cascader-panel").hide();
});
// 级联选择器第一级
$(".cascader").click(function (e) {
e.stopPropagation();
$(".eo-cascader-panel").show();
$(".eo-cascader-panel").empty();
$(".eo-cascader-panel").append(
`<ul class="eo-cascader-menu1" data-level="1"></ul>`
);
for (var i = 0; i < tags.length; i++) {
var tempId = tags[i].id;
var tempText = tags[i].label;
var children = JSON.stringify(tags[i].children) || "";
$(".eo-cascader-menu1").append(
`<li data-id="${tempId}" data-index="${i}" data-children=${children}>${tempText}</li>`
);
}
handlerCascader();
});
// 级联效果
function handlerCascader() {
// li的点击效果
$(".eo-cascader-panel")
.off("click")
.on("click", "li", function (e) {
e.stopPropagation();
$(".eo-cascader-panel li").removeClass("active");
$(this).addClass("active");
$(".cascader").text($(this).text()); // 设置选中文字
$("input.my_cascader").val($(this).data("id")); // 设置选中id
var tempTags1 = $(this).data("children"); // 子元素
var tempLevel = +$(this).parent().data("level"); // 当前级别
var currentDom = "eo-cascader-menu" + tempLevel; // 当前ul的类名
var nextDom = "eo-cascader-menu" + (+tempLevel + 1); // 下一个ul类名
// 清空当前ul元素后面的内容
$("." + currentDom)
.nextAll()
.remove();
if (tempTags1.length) {
$("." + currentDom).after(
`<ul class="${nextDom}" data-level="${tempLevel + 1}"></ul>`
);
for (var j = 0; j < tempTags1.length; j++) {
var tempId = tempTags1[j].id;
var tempText = tempTags1[j].label;
var children = JSON.stringify(tempTags1[j].children) || "";
$("." + nextDom).append(
`<li data-id="${tempId}" data-index="${j}" data-children=${children}>${tempText}</li>`
);
}
}
});
}
</script>
</body>
</html>