`
D-tune
  • 浏览: 77684 次
  • 性别: Icon_minigender_1
  • 来自: 上海浦东
文章分类
社区版块
存档分类
最新评论

TreeTable的简单实现

阅读更多

最终效果图:
效果图

UI说明:针对table本身进行增强的tree table组件。
tree的数据来源是单元格内a元素的自定义属性:level和type。具体代码如下:

<table id="treeGrid" border="0" cellpadding="0" cellspacing="0">
  <THEAD>
  		<tr><th>Department</th><th>EmployeeID</th><th>position</th></tr>	
  </THEAD>
  <TBODY>
		<tr><td width="250px"><a level="0" type="node" href="javascript:void(0);">Dept4</a></td><td>-</td><td>-</td></tr>
		<tr><td><a level="1" type="leaf" href="javascript:void(0);">fanggw</a></td><td>c3025</td><td>MASTER</td></tr>
		<tr><td><a level="1" type="node" href="javascript:void(0);">team1</a></td><td>-</td><td>-</td></tr>
		<tr><td><a level="2" type="leaf" href="javascript:void(0);">zhanghy</a></td><td>c3268</td><td>SE</td></tr>
		<tr><td><a level="2" type="leaf" href="javascript:void(0);">chenf</a></td><td>c3401</td><td>SE</td></tr>
   </TBODY>
</table>


根据上述数据源结构,先遍历该table,读取数据并建立整课树的数据模型,然后初始化整棵树的视图(node和leaf的显示由css样式定义,方便修改,如果需要可以进一步在初始化的时候由外部代码指定),并关联节点的click处理程序。

下面是主要的实现代码:

		
		var Class = {
		  create: function() {
		    return function() {
		      this.initialize.apply(this, arguments);
		    }
		  }
		}
    
    var Node = Class.create();
    Node.prototype = {
    	initialize: function(link, level, type) {
    		this.name = link.innerText;      
			  this.id;
			  this.link = link;
			  this.type = type;
			  this.level = level;	
			  this.isOpen = true;
			  this.isClicked = false;
			  this.root;
			  this.img;	//clicked img's path

				this.parent;
			  this.children = new Array();
			  this.getChildren();
			  
    	},
    	
    	getChildren: function() {
    		if (this.type == "node") {
    			//alert(this.link.innerText);
	    		var dataRows = document.getElementById("treeGrid").getElementsByTagName("TBODY")[0].getElementsByTagName("TR");
	    		var pushFlag = false;
	    		
	    		for(var j=0; j<dataRows.length; j++) {
	    			var linkTag = dataRows[j].firstChild.firstChild;
	    			var level = linkTag.getAttribute("level");
	    			var type = linkTag.getAttribute("type");
	    			
	    			if (!pushFlag) {
	    				if (linkTag == this.link) {
	    					pushFlag = true;
	    				}
	    				continue;
	    			}
	    			//alert("cur lvl:"+level+"; type:"+type +" ;parentLvl:" +(parseInt(this.level)+1));
	    			
	    			if (level == (parseInt(this.level)+1)) {
	    				//alert("push node's lvl:"+level+"; type:"+type);
	    				var leaf = new Node(linkTag, level, type);
	    				leaf.parent = this;
	    				leaf.id = level+"_"+j;
	    				this.children.push(leaf);
	    			} else if (level == this.level) {
	    				break;
	    			} else {
	    				continue;
	    			}
	    			
	    		}
    		}
    		//for (var i=0; i<this.children.length; i++) {
    			//this.children[i].parent = this;
    		//}
    		//alert("childs:"+this.children.length);
    	},
    	
    	getNext: function() {
    		var next = null;
    		//alert(this.name);
    		
    		if (this.parent) {
	    		for (var i=0; i<this.parent.children.length; i++) {
	    			if (this.parent.children[i] == this && i < (this.parent.children.length-1)) {
	    				next = this.parent.children[i+1];
	    				break;
	    			}
	    		}	
    		}
    		/*
    		if (next)
    			alert("next:"+next.name);
    		else 
    			alert("current is last");
    		*/
    		return next;
    	},
    	
    	
    	getCurrentRow: function() {
				return this.link.parentNode.parentNode.parentNode;   		
    	},
    	
    	changeClickImg: function() {
    		if (this.isOpen) {
    			this.img.src = this.img.src.replace("minus", "plus");
    		} else {
    			this.img.src = this.img.src.replace("plus","minus");
    		}
    		this.isOpen = this.isOpen?false:true;
    	},
    	
    	getInnerHTML: function() {
    		var oFragment = document.createDocumentFragment();
    		
    		//make the indent img by level
	    	for (var lvl = this.level-1; lvl>0; lvl--) {
	    		var indentImg = document.createElement("img");
	    		
	    		//get parent node by level
	    		var parentNode = this.parent;
	    		for (var i=1; i<lvl; i++) {
	    			parentNode = parentNode.parent;
	    		}
	    		
	    		//alert(this.name+":"+parentNode.name);
	    		//alert(parentNode.getNext()?parentNode.getNext().name:"null");
	    		
	    		/* parent node has nextSibling insert vertical line img */
	    		if (parentNode.getNext()) {
	    			indentImg.src = "./images/I.gif";
	    		} else {
	    			/* parent node has nextSibling insert blank img */
	    			indentImg.src = "./images/blank.gif";
	    		}
    			indentImg.align = "absbottom";
					oFragment.appendChild(indentImg);
    		}

    		
    		//make the plus or minus img
    		var img = document.createElement('img');
    		var path;
    		if (this.type == "node") {
    			if (this.level == 0) {
    				path = "./images/minus.gif";
    			} else {
    				if (this.children.length > 0) {
    					if (this.getNext()) {
    						path = "./images/Tminus.gif";
    					} else {
    						path = "./images/Lminus.gif";
    					}
    				}
    				else {
    					if (this.getNext()) {
    						path = "./images/T.gif";
    					} else {
    						path = "./images/L.gif";
    					}
    				}
    			}    			
    		} else {
  				if (this.getNext()) {
  					path = "./images/T.gif";
  				}
  				else {
  					path = "./images/L.gif";
  				} 
    		}
    		img.src = path;
			  img.align = "absbottom";
			  //set cursor pointer style to the minus/plus img
			  img.style.cursor = "pointer"
			  this.img = img;
			  img.onclick = expand;
			  
			  oFragment.appendChild(img);
			  oFragment.appendChild(this.link);
			  
			  var div = document.createElement("div");
			  div.setAttribute("id", this.id);

			  /* div css class set by type */
			  div.className = (this.type=="node")?"node":"leaf"; 
			  
			  /* all node is margin to left by 10 pixel except root */
			  if (this.level > 0) {
				  div.style.marginLeft = "10px";
			  }
			  
				div.appendChild(oFragment);
				return div;
    		
    	}
    }
    
    /* global variable */
    //tree root
    var root;
    //all nodes of the tree
    var nodes = new Array();
    
    /* initialize the whole tree grid */
    function initTreeGrid() {
		  //dataRows is the datasource of the tree
			var dataRows = document.getElementById("treeGrid").getElementsByTagName("TBODY")[0].getElementsByTagName("TR");
    	
    	//find the root of the tree
    		for (var i=0; i<dataRows.length; i++) {
    			var linkTag = dataRows[i].firstChild.firstChild;
    			var level = linkTag.getAttribute("level");
    			var type = linkTag.getAttribute("type");
    			
    			if (level == 0 && type == "node") {
	  				var root = new Node(linkTag, 0, "node");
	  				root.parent = null;
	  				root.id = "0_0";
						break;
    			}
    		}
    		
    		//put all node into 1-index array
    		nodes.push(root);
    		initNodes(root);
    		
    		//display the table tree
    		for (var j = 0; j<nodes.length; j++) {
    			dataRows[j].firstChild.appendChild(nodes[j].getInnerHTML());
    		}
    }
    
    function initNodes(node) {
    	  for (var j=0; j<node.children.length; j++) {
    			nodes.push(node.children[j]);
    			if (node.children[j].children.length > 0) {
    				initNodes(node.children[j]);
    			}
    		}
    }
    
    /* expand row elements by isOpen flag */
    function expand() {    	
    	var currentDivId = event.srcElement.parentNode.id;
    	var currentNode;
    	
    	//get the clicked node
    	for(var i=0; i<nodes.length; i++) {
    		if (currentDivId == nodes[i].id) {
    			currentNode = nodes[i];
    			break;
    		}
    	}
    	
    	//expand the clicked node
    	expandChild(currentNode);
    	
    	//set the isClicked flag when the row minus img is clicked
    	currentNode.isClicked = currentNode.isClicked?false:true;
    }
    
    function expandChild(currentNode) {
    	//alert(currentNode.name);
    	for (var i=0; i<currentNode.children.length; i++) {
    		var child = currentNode.children[i];
    		if (child.type == "node" && !child.isClicked) {
    			expandChild(child);
    		}
    		child.getCurrentRow().style.display = currentNode.isOpen?"none":"block";
    	}
    	currentNode.changeClickImg();
    }
		
		/* utility function */
		function addEvent(obj, evType, fn) {
		    /* adds an eventListener for browsers which support it
		       Written by Scott Andrew: nice one, Scott */
		    if (obj.addEventListener) {
		        obj.addEventListener(evType, fn, true);
		        return true;
		    }
		    else if (obj.attachEvent) {
			    var r = obj.attachEvent("on"+evType, fn);
		        return r;
		    }
		    else {
			    return false;
		    }
		}
		
		/* add load event to body element*/
		addEvent(window, "load", initTreeGrid);


该组件已在IE6+,Firefox上测试通过。
有兴趣的朋友可以联系我,进行进一步的改进和扩展。

 

  • 描述: TreeTable
  • 大小: 21.4 KB
分享到:
评论
8 楼 lining6719 2008-08-06  
楼主提供一下此源码的下载吧,谢谢了
7 楼 sjz209 2008-07-10  
有兴趣,如何联系
6 楼 bixiukun 2008-07-09  
很好很强大 得多想 楼主学习
5 楼 shenchengli 2008-06-23  
可以看一下源码么
4 楼 vtsuper 2008-05-09  
很有興趣...
必須支援空的資料夾才行哦!!!

vtsupermok at gmail.com
3 楼 hbezwwl 2008-05-09  
给你发了留言,希望可以试试你的组件。

53320295@qq.com
2 楼 bjhawk 2008-05-06  
您好,您的TreeTable 能动态生成么?通过ajax取得下一级菜单,能否给我发一个发一个完整的例子和源代码,谢谢您了! oudong@fangbian.com
1 楼 lizhengfa 2008-04-07  
很好!可以把源代码给我一份 lizhengfa129@163.com

相关推荐

    jquery treetable完美实现可全打开全隐藏

    在"jquery treetable完美实现,可无限增加层级,可全打开全隐藏"的场景下,我们将深入探讨如何利用这个库来构建功能丰富的树形表格。 1. **安装与引入** 首先,确保你已经在项目中引入了jQuery库。接着,通过CDN或...

    用jQuery的treetable实现的树形table

    下面将详细探讨如何使用jQuery的treetable来实现树形table。 首先,我们需要理解treetable的基本概念。TreeTable是一种结合了表格和树状视图的数据展示方式,它在每个表格行中添加了一个展开/折叠按钮,使得用户...

    treetable简单实例

    **标题:“treetable简单实例”** 在网页开发中,数据展示的方式多种多样,其中一种高效且具有层次感的展示方式就是TreeTable(表格树)。TreeTable结合了表格的行列结构与树形结构的优点,使得复杂的层级数据可以...

    jquery-treetable简单实用树表格demo.rar

    《jQuery-treetable:构建美观实用的树形表格》 ...在压缩包中的"jquery-treetable简单实用树表格deo"文件中,你可以找到一个完整的演示实例,通过查看和运行代码,可以更好地理解其工作原理和用法。

    jquery-treetable最简单实例

    总结来说,jQuery Treetable通过简单的配置和HTML标记,即可实现树形表格的展示,极大地简化了开发工作。在这个“最简单实例”中,我们了解了其基本用法,包括引入库、创建表格、初始化插件等步骤。希望这个实例能...

    treeTable例子

    在本示例中,我们将会深入探讨TreeTable的基础概念、应用场景以及如何实现一个简单的TreeTable。 1. TreeTable基础 TreeTable是一种将树形结构和表格数据结合的UI组件,常用于展现具有层级关系的数据,如组织架构...

    Layui的树形表格treeTable

    下面我们将深入探讨Layui的treeTable,以及如何实现无限层级的树形表格。 1. **Layui TreeTable的基本概念** - **TreeTable结构**:在Layui中,树形表格是由普通的表格扩展而来,每个单元格可以展开或折叠,展示其...

    树形表格 treetable 完整版 带演示demo例子

    在IT领域,树形表格(TreeTable)是一种特殊的数据展示方式,它结合了表格和树状结构的优点,常用于组织层次分明、具有父子关系的数据。本文将深入探讨“树形表格treetable完整版”,包括它的特点、应用场景、二次...

    Layui树形表格treetable

    在LayUI中,TreeTable可以通过简单的配置和API调用来创建。 要使用LayUI的TreeTable,你需要首先确保已经引入了LayUI库。在本例中,压缩包中包含了一个名为"layer-v3.1.1"的文件,这可能是LayUI的一个版本。通常,...

    jquery-treetable

    今天我们将深入探讨jQuery TreeTable插件,它为开发者提供了一种简单、灵活的方式来创建可扩展、交互式的树形表格。 jQuery TreeTable是基于流行的JavaScript库jQuery的一款插件,其核心功能在于将普通的HTML表格...

    JQUERY TreeTable控件

    jQuery TreeTable控件便是实现这一功能的JavaScript库,它使得在网页上创建交互式、可折叠的表格变得简单易行。 **1. jQuery TreeTable概述** jQuery TreeTable是基于流行的jQuery库构建的,其目的是将普通的HTML...

    jquery的TreeTable插件

    总结来说,jQuery TreeTable插件为开发者提供了简单易用的工具,通过简单的配置就能实现强大的树形表格功能,极大地提高了网页数据展示的用户体验。在实际开发中,可以根据项目需求进行适当的定制和扩展,让数据展现...

    jquery-treetable-master

    jQuery TreeTable是由Mario Heiderich开发的一款开源插件,它基于流行的jQuery库,无需复杂的代码就能实现树形表格的创建和操作。通过简单的HTML标记和jQuery方法,开发者可以快速地将普通的表格转换为可展开和折叠...

    jquery TreeTable

    以下是一个简单的`jQuery TreeTable`代码示例: ```html &lt;!DOCTYPE html&gt; &lt;title&gt;jQuery TreeTable 示例 &lt;link rel="stylesheet" href="treetable.css"&gt; &lt;script src="jquery.js"&gt;&lt;/script&gt; &lt;script src="...

    jquery treetable树形表格菜单插件

    总之,jQuery Treetable插件通过简单的配置和强大的功能,极大地增强了HTML表格的表现力,为开发者提供了构建高效、互动的树形表格菜单的工具。在实际项目中,结合具体需求和用户反馈,合理运用并优化,可以打造出...

    JQuery Treetable

    这个插件基于流行的jQuery库,为用户提供了一种便捷的方式来展示层次结构的数据,同时也支持动态加载数据,使得在客户端构建和管理复杂的数据结构变得非常简单。 ### 1. 动态加载数据 动态加载数据是jQuery ...

    jquery treetable

    jQuery TreeTable就是通过JavaScript实现的,可以在客户端动态地创建和操作树形表格。 ### 功能特性 1. **可扩展性**: jQuery TreeTable可以通过添加自定义样式和脚本来扩展其默认功能,以满足特定项目需求。 2. *...

    原创jquery插件treeTable.pdf

    TreeTable 是一个基于 jQuery 的插件,用于将普通...使用 TreeTable 非常简单,首先需要引入 jQuery 库和 treeTable 插件的 JS 文件,然后通过 jQuery 选择器调用 `.treeTable()` 方法并传入配置对象。例如: ```html ...

    jquery 树表格控件 treetable

    jQuery TreeTable支持多种事件,如`expand`、`collapse`、`load`等,通过这些事件,开发者可以实现更多的交互功能。 ```javascript $("#myTreeTable").on("expand.treetable", function (event, node) { console....

    TreeTableJava实现树形结构表格

    treeTable是跨浏览器、性能很高的jquery的树表组件,它使用非常简单,只需要引用jquery库和一个js文件,接口也很简单。 优点 兼容主流浏览器: 支持IE6和IE6+, Firefox, chrome, Opera, Safari 接口简洁: 在普通...

Global site tag (gtag.js) - Google Analytics