根据原生js、html实现的treeview组件

html 复制代码
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
ul, #myUL {
  list-style-type: none;
}

#myUL {
  margin: 0;
  padding: 0;
}

.caret {
  cursor: pointer;
  -webkit-user-select: none; /* Safari 3.1+ */
  -moz-user-select: none; /* Firefox 2+ */
  -ms-user-select: none; /* IE 10+ */
  user-select: none;
}

.caret::before {
  content: "\25B6";
  color: black;
  display: inline-block;
  margin-right: 6px;
}

.caret-down::before {
  -ms-transform: rotate(90deg); /* IE 9 */
  -webkit-transform: rotate(90deg); /* Safari */'
  transform: rotate(90deg);  
}

.nested {
  display: none;
}

.active {
  display: block;
}
</style>
</head>
<body>

<ul id="myUL">

</ul>

<script>
  // 根据json生成treeview
  var input_data = {
  "item1": {
      "link1":"www.baidu.com",
      "link2":"www.youtube.com"
    },
  "item2": {
    "link1":"www.aaa",
    "link2":"www.bbb"
  }
};

function generateTreeview(data, parentElement) {
  for (var key in data) {
    var value = data[key];
    
    // 创建父节点
    var parentNode = document.createElement("li");
    parentElement.appendChild(parentNode);
    
    // 创建展开/折叠图标
    var caretNode = document.createElement("span");
    caretNode.classList.add("caret");
    caretNode.textContent = key;
    parentNode.appendChild(caretNode);
    
    // 创建子节点
    var nestedNode = document.createElement("ul");
    nestedNode.classList.add("nested");
    parentNode.appendChild(nestedNode);
    
    // 若子节点为对象,则递归生成子树
    if (typeof value === "object") {
      generateTreeview(value, nestedNode);
    } else {
      // 创建子节点文本
      var childNode = document.createElement("li");
      var li_link = document.createElement("a")
      li_link.href = value
      li_link.innerText = value
      
      childNode.append(li_link)
      // childNode.textContent = value;
      nestedNode.appendChild(childNode);
    }
  }
}

// 获取根节点元素
var rootElement = document.getElementById("myUL");

// 生成树形视图
generateTreeview(input_data, rootElement);
    // 折叠
var toggler = document.getElementsByClassName("caret");
var i;

for (i = 0; i < toggler.length; i++) {
  toggler[i].addEventListener("click", function() {
    this.parentElement.querySelector(".nested").classList.toggle("active");
    this.classList.toggle("caret-down");
  });
}
</script>

</body>
</html>

效果图

相关推荐
z落落几秒前
C# Modbus-RTU 串口读写设备+CRC16+邮件告警
开发语言·c#
DS随心转小程序1 分钟前
Gemini只能导出了一部分Word文档,很少的一部分,不是我这个窗口所有的对话内容?
开发语言·人工智能·c#·word·豆包·deepseek·ai导出鸭
全栈项目管理程序猿3 分钟前
ArcGIS JS 基础教程(14):Map、View 与 Layer 关系
javascript
江畔柳前堤3 分钟前
消息队列:从直觉到精通的完整认知地图
开发语言·人工智能·算法·机器学习·ruby on rails·scala
格林威11 分钟前
C# 相机图像配合频闪光源:实现高速稳定拍摄的几个方法
开发语言·网络·人工智能·数码相机·计算机视觉·c#·视觉检测
Southern Wind18 分钟前
从一段文字到一部动态漫:如何打造全流程分镜创作工作台 StoryCanvas AI
前端·javascript·vue.js·人工智能
布莱克60529 分钟前
单例模式详解:什么是单例模式,它能解决哪些问题?
开发语言·qt·单例模式
charlie11451419139 分钟前
deque、list 与 forward_list:vector 之外的三个选择
开发语言·数据结构·c++·list·开源项目
mayaairi1 小时前
JS DOM属性操作完全指南:内容、样式与自定义属性
开发语言·前端·javascript
avi91111 小时前
Threejs新版本后glb导出提示.x问题GLTFExporter,替代3dmax
开发语言·前端·javascript·threejs·glb·gltfexporter