1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| function generateCategoriesTreeChart(categoryTree, darkMode, colors){ const data = JSON.stringify([categoryTree]); return ` <script> const treeChart = echarts.init(document.getElementById('categoriesTreeChart'), '${darkMode}'); treeChart.setOption({ title: { text: '操作提示:单击展开分类,双击进入具体分类页面', textStyle: { fontSize: 12, color: '#999', fontWeight: 'normal' }, bottom: 0, left: 'center' }, tooltip: { trigger: 'item', triggerOn: 'mousemove' }, series: [{ type: 'tree', data: ${data}, initialTreeDepth: -1, // 默认展开所有节点 top: '5%', // 调整上边距 bottom: '5%', // 调整下边距,为提示文字留出更多空间 left: '0%', // 调整左边距 right: '0%', // 调整右边距 symbolSize: 15, // 增大节点大小 layout: 'orthogonal',// 使用正交布局 orient: 'TB', // 从左到右布局 itemStyle: { color: '${colors.categoryColors[0]}', borderColor: '${colors.categoryColors[1]}' }, label: { position: 'bottom', verticalAlign: 'middle', align: 'center', fontSize: 14, // 增大字体 distance: 28, // 标签与节点的距离 formatter: function(params) { return params.data.name + (params.data.count ? ' (' + params.data.count + ')' : ''); } }, leaves: { label: { position: 'top', verticalAlign: 'middle', align: 'center' } }, emphasis: { focus: 'descendant' }, expandAndCollapse: true, animationDuration: 550, animationDurationUpdate: 750, lineStyle: { width: 1.5, // 增加线条宽度 curveness: 0.5 }, nodeAlign: 'justify',// 节点对齐方式 levelStep: 200 // 增加层级间距 }] }); let lastClickTime = 0; let timer = null; treeChart.on('click', function (params) { const currentTime = new Date().getTime(); const timeDiff = currentTime - lastClickTime; // 清除之前的定时器 if (timer) { clearTimeout(timer); } // 如果两次点击间隔小于300ms,认为是双击 if (timeDiff < 300) { // 双击事件 - 跳转链接 if (params.data.path) { window.location.href = '/categories/' + params.data.path; } } else { // 单击事件 - 设置延时以区分双击 timer = setTimeout(() => { // 获取当前节点的展开状态 const expandedNodes = treeChart.getOption().series[0].data[0]; // 使用路径查找节点 const currentNode = findNodeByPath(expandedNodes, params.data.path || ''); if (currentNode) { // 切换展开/收起状态 currentNode.collapsed = !currentNode.collapsed; // 更新图表 treeChart.setOption({ series: [{ data: [expandedNodes] }] }); } }, 300); } lastClickTime = currentTime; }); // 使用路径查找节点的新函数 function findNodeByPath(tree, targetPath) { if (!targetPath) return null; // 如果是根节点 if (tree.path === targetPath) { return tree; } // 递归查找子节点 if (tree.children) { for (let child of tree.children) { const found = findNodeByPath(child, targetPath); if (found) return found; } } return null; } </script> `; }
|