function Node(id, pid, name) {
this.index;
this.id = id;
this.pid = pid;
this.name = name;
this.isLeaf = true;
this.lastSibling = false;
this.isClose = true;
}
function Tree() {
// this.icon = { empty:" ", folder:"■", join:"┠", joinbottom:"┖",
// line:"┃", page:"◇"
// }
this.icon = {
empty:"<img src='img/empty.gif' />",
folder:"img/folder.gif",
folderopen:"img/folderopen.gif",
plus:"img/plus.gif",
plusbottom:"img/plusbottom.gif",
minus:"img/minus.gif",
minusbottom:"img/minusbottom.gif",
join:"<img src='img/join.gif' />",
joinbottom:"<img src='img/joinbottom.gif' />",
line:"<img src='img/line.gif' />",
page:"<img src='img/page.gif' />"
};
this.root = null;
this.nodes = [];
this.indents = [];
this.str = "";
}
Tree.prototype.addNode = function(id, pid, name) {
var len = this.nodes.length;
this.nodes[len] = new Node(id, pid, name);
this.nodes[len].index = len;
}
Tree.prototype.toString = function() {
this.str = "<div class=\"dtree\">";
this.initRoot();
this.travel(this.root);
this.str += "</div>";
window.clipboardData.setData("text", this.str);
return this.str;
}
Tree.prototype.initRoot = function() {
var i = 0;
var pNode = this.nodes[i];
for(i=1; i<this.nodes.length; i++)
if(this.nodes[i].id==pNode.pid) {
pNode = this.nodes[i];
i = 1;
continue;
}
if(i==this.nodes.length)
this.root = pNode;
}
Tree.prototype.travel = function(pNode) {
this.setLS(pNode);
this.visit(pNode);
if(!pNode.isLeaf) {
if(pNode.isClose)
this.str += "<div id=\"clip" + pNode.index + "\" class=\"clip\" style=\"display:none\" >";
else
this.str += "<div id=\"clip" + pNode.index + "\" class=\"clip\" style=\"display:block\" >";
this.indents.push(pNode.lastSibling);
for(var i=0; i<this.nodes.length; i++) {
if(this.nodes[i].pid==pNode.id)
this.travel(this.nodes[i]);
}
this.indents.pop();
this.str += "</div>";
}
}
Tree.prototype.visit = function(node) {
if(this.root!=node && node.isClose)
this.str += "<div id=\"doc" + node.index + "\" class=\"dTreeNode\" style=\"display:none\" >";
else
this.str += "<div id=\"doc" + node.index + "\" class=\"dTreeNode\" style=\"display:block\" >";
for(var i=0; i<this.indents.length; i++)
this.str += this.indents[i]?this.icon.empty:this.icon.line;
if(node.isLeaf) {
this.str += node.lastSibling?this.icon.joinbottom:this.icon.join;
this.str += this.icon.page;
} else {
this.str += "<a href=\"javascript: d.o(" + node.index + ");\">"
this.str += "<img id=\"join" + node.index + "\" src=\"";
this.str += node.lastSibling?(node.isClose?this.icon.plusbottom:this.icon.minusbottom):(node.isClose?this.icon.plus:this.icon.minus);
this.str += "\" />"
this.str += "</a>"
this.str += "<img id=\"folder" + node.index + "\" src=\"" + this.icon.folder + "\" />";
}
this.str += node.name;
this.str += "</div>";
}
Tree.prototype.o = function(index) {
var pNode = this.nodes[index];
document.getElementById("clip"+index).style.display = pNode.isClose?"block":"none";
document.getElementById("join"+index).src = pNode.isClose?this.icon.minusbottom:this.icon.plusbottom;
document.getElementById("folder"+index).src = pNode.isClose?this.icon.folderopen:this.icon.folder;
for(var i=0; i<this.nodes.length; i++) {
if(this.nodes[i].pid==pNode.id) {
document.getElementById("doc"+this.nodes[i].index).style.display = pNode.isClose?"block":"none";
}
}
pNode.isClose = !pNode.isClose;
}
Tree.prototype.setLS = function(node) {
var lastNode;
for(var i=0; i<this.nodes.length; i++) {
if(this.nodes[i].pid == node.id)
node.isLeaf = false;
if(this.nodes[i].pid == node.pid)
lastNode = this.nodes[i];
}
if(lastNode == node)
node.lastSibling = true;
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Destroydrop » Javascripts » Tree</title>
<link rel="StyleSheet" href="dtree.css" type="text/css" />
<script type="text/javascript" src="xtree.js"></script>
</head>
<body>
<h1><a href="/">Destroydrop</a> » <a href="/javascripts/">Javascripts</a> » <a href="/javascripts/tree/">Tree</a></h1>
<h2>Example</h2>
<div class="dtree">
<p><a href="javascript: d.openAll();">open all</a> | <a href="javascript: d.closeAll();">close all</a></p>
<script type="text/javascript">
<!--
d = new Tree();
d.addNode(0,-1,'My example tree');
d.addNode(1,0,'Node 1');
d.addNode(2,0,'Node 2');
d.addNode(3,1,'Node 1.1');
d.addNode(4,0,'Node 3');
d.addNode(5,3,'Node 1.1.1');
d.addNode(6,5,'Node 1.1.1.1');
d.addNode(7,0,'Node 4');
d.addNode(8,1,'Node 1.2');
d.addNode(9,0,'My Pictures');
d.addNode(10,9,'The trip to Iceland');
d.addNode(11,9,'Mom\'s birthday');
d.addNode(12,0,'Recycle Bin');
document.write(d);
//-->
</script>
</div>
<p><a href="mailto:drop@destroydrop.com">©2002-2003 Geir Landrö</a></p>
</body>
</html>
分享到:
相关推荐
总的来说,JavaScript树形菜单是通过DOM操作和事件处理来实现的。在实际项目中,可能会结合使用前端框架如React、Vue或Angular,以及第三方库如jQuery UI或jsTree,以简化开发并提供更丰富的功能。在压缩包中的"树形...
JavaScript树形目录是一种在网页应用中组织数据结构的方法,它以层级关系呈现,类似于计算机文件系统的目录结构。这种数据结构在各种应用场景中都非常常见,比如网站导航、文件管理器、组织图表等。在这个主题中,...
javascript树形菜单
"百万节点javascript树"项目专注于解决这个问题,允许开发者创建一个包含100万个节点的树。这种能力对于处理大量数据,如文件系统、组织架构或者复杂的依赖关系图,具有重要意义。 在JavaScript中,树通常通过对象...
javascript写各种样式的树形菜单
JavaScript树形控件是一种在网页中用于展示层次结构数据的交互式组件,它通常以节点的形式呈现,每个节点可以展开或折叠,展示其子节点。这种控件在各种应用场景中非常常见,例如文件目录浏览、组织结构展示、菜单...
总的来说,构建JavaScript树形菜单涉及的技术包括HTML结构设计、CSS样式控制、JavaScript DOM操作、事件处理、数据结构和算法(如遍历树形结构)、以及可能的异步加载和动画效果。通过这些技术的组合,我们可以创建...
JavaScript树是一种在Web应用中常用来展示层次结构数据的交互式元素。在JavaScript中实现树形结构,可以方便用户以图形化方式查看和操作数据,比如文件系统、组织架构或菜单系统。"Javascript树"通常涉及到DOM操作、...
实现JavaScript树形菜单的基本步骤包括: 1. **定义节点对象**:创建一个Node类或对象,包含节点值、子节点数组和其他属性(如是否展开等)。 2. **构建数据结构**:根据实际需求,构建树的数据结构,即定义各个...
JavaScript树形菜单是一种在网页中实现层次结构数据展示的交互方式,它通常用于导航、文件管理、选项配置等场景。"带复选框"的JS树形菜单则更进一步,允许用户通过勾选复选框来选择或操作树节点,为用户提供了一种...
JavaScript树形目录(Tree)是一种数据结构,常用于在网页中展示层次化的信息,比如文件系统、组织架构或导航菜单。这种数据结构以节点的形式表示,每个节点可以有零个或多个子节点,形成一种“父节点-子节点”的...
JavaScript树形控件是一种在网页上实现层次结构展示的用户界面元素,通常用于展示目录结构、组织架构或者数据分类等。由于HTML标准中并未内置这样的组件,开发者需要借助JavaScript库或者自定义代码来创建这样的功能...
JavaScript树是一种数据结构,它代表了层次化的节点集合,这些节点通过父节点和子节点的关系组织起来,类似于自然界中的树状结构。在编程中,树常用于表示具有层级关系的数据,例如文件系统、HTML DOM(文档对象模型...
JavaScript树在Web开发中是一种常见的数据结构,常用于构建导航菜单、组织结构图或文件系统目录等。在JavaScript中实现树形结构,主要是通过对象和数组来模拟实际的树节点和层级关系。在这个场景下,"给定当前节点的...