级联选择器

初版

<!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 #dcdfe6;
        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: #606266;
        border: 1px solid #e4e7ed;
        border-right: none;
        position: relative;
      }
      .eo-cascader-panel ul:last-child {
        border-right: 1px solid #e4e7ed;
      }

      .eo-cascader-panel ul li {
        list-style: none;
        cursor: pointer;
        padding: 6px 10px;
      }
      .eo-cascader-panel ul li.active {
        background: #1ca3fc;
        color: #fff;
      }
      .eo-cascader-panel ul li:hover {
        background: #1ca3fc;
        color: #fff;
      }
    </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 #dcdfe6;
        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: #606266;
        border: 1px solid #e4e7ed;
        border-right: none;
        position: relative;
      }
      .eo-cascader-panel ul:last-child {
        border-right: 1px solid #e4e7ed;
      }

      .eo-cascader-panel ul li {
        list-style: none;
        cursor: pointer;
        padding: 6px 10px;
      }
      .eo-cascader-panel ul li.active {
        background: #1ca3fc;
        color: #fff;
      }
      .eo-cascader-panel ul li:hover {
        background: #1ca3fc;
        color: #fff;
      }
    </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>
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值