<!doctype html>
<title>树 by 司徒正美</title>
<meta charset="utf-8"/>
<meta name="keywords" content="树 by 司徒正美" />
<meta name="description" content="树 by 司徒正美" />
<h2>树 by 司徒正美</h2>
<script type="text/javascript">
Tree = function(){
this.path = "http://images.cnblogs.com/cnblogs_com/rubylouvre/205314/o_";
this.name = "tree";
this.id = + new Date + parseInt(Math.random()*100000);
this.initialize.apply(this, arguments);
}
Tree.prototype = {
constructor : Tree,
initialize : function(config){
var me = this, renderTo = config.renderTo;
me.tree = config.data;
me.container = ((typeof renderTo === "string") ?
document.getElementById(renderTo) : renderTo) || document.body;
me.panel = document.createElement("div");
me.panel.setAttribute("id","tree" + me.id)
me.container.insertBefore(me.panel,null);
var id = "#"+me.panel.id;
var sheet = document.createElement('style');
sheet.type = 'text/css';
document.getElementsByTagName('head')[0].appendChild(sheet);
var bg = "background:transparent url("+me.path;
var cssCode = id +" {font-size:12px;}\n" +
id+" img {border:0;vertical-align: middle;}\n" +
id+" span {vertical-align: bottom;}\n"+
id+" .line {padding-left:18px;"+bg+"line.gif) repeat-y 0 0;}\n"+
id+" .blank {margin-left:18px;}\n"+
id+" img.collapse {padding-right:18px;"+bg+"folder.gif) no-repeat right center;}\n"+//控制枝节点的装饰图标(闭合)
id+" img.unfold {padding-right:18px;"+bg+"folderopen.gif) no-repeat right center;}\n"+//控制枝节点的装饰图标(展开)
id+" img.root {padding-right:18px;"+bg+"root.gif) no-repeat right center;}\n"+ //控制根节点的装饰图标
id+" img.leaf {padding-right:18px;"+bg+"leaf.gif) no-repeat right center;}\n" //控制叶节点的装饰图标
if(!+"\v1"){
sheet.styleSheet.cssText = cssCode
}else if(/a/[-1]=='a'){
sheet.innerHTML = cssCode
}else{
sheet.appendChild(document.createTextNode(cssCode));
}
//添加根节点
var icon = me.makeImage("nolines_plus","collapse root")
var checkbox0 = me.makeImage("checkbox_0","checkbox_0");
me.panel.innerHTML = me.makeTree(me.tree[0][0],"b",0,icon+checkbox0, me.tree[0][2]);
me.childs = [];
me.checks = [];//由来装载点击数
me.panel.onclick = function(e){
e = e || window.event;
var node = e.srcElement ? e.srcElement : e.target;
var current = node.parentNode;
var currentIndex = current.getAttribute("index");
var currentPrefix = current.getAttribute("prefix");
var currentLevel = current.getAttribute("level");
var subtree = me.getSubtree(currentIndex);
var children = current.children[3];
//添加子树集合
//存在子树并且没有添加时才添加
if(subtree && !children){
children = document.createElement("div");
var childs = [];
for(var i=0,length = subtree.length;i<length;i++){
var isLimb = me.hasSubtree(subtree[i][0]);
var isLast = (i == subtree.length - 1);
var prefix = isLast ? "blank" : "line";
icon = isLast ? "plusbottom" : "plus";
if(isLimb){
icon = me.makeImage(icon,"collapse limb");//枝节点前面的装饰图标
}else{
icon = icon.replace(/plus/, "join");//叶子节点前面的连线图标
icon = me.makeImage(icon,"leaf");//叶子节点前面的装饰图标
}
childs.push(subtree[i][0])
children.innerHTML += me.makeTree(subtree[i][0],prefix,+currentLevel+1,icon+checkbox0,subtree[i][2])
}
me.childs[currentIndex] = childs;
children.className = (currentPrefix == "line") ? "line": "blank";
current.insertBefore(children,null);
}
if(/collapse/.test(node.className)){//如果点击是加号或减号图标
node.src = node.src.replace(/plus/,"minus");//改变连线图标
node.className = node.className.replace("collapse","unfold");//改变装饰图标
children &&(children.style.display = "block");
}else if(/unfold/.test(node.className)){
node.src = node.src.replace(/minus/,"plus");//改变连线图标
node.className = node.className.replace("unfold","collapse");//改变装饰图标
children &&(children.style.display = "none");
}
if(/checkbox/.test(node.className)){//如果单击的是checkbox图标
var checked = me.isChecked(node);//如果是true则--,如果是false则++
me.setPriorCheckbox(current,checked);//一开始肯定是checkbox,返回false
me.setJuniorCheckbox(current,checked)
}
}
},
setJuniorCheckbox : function(node,/*Boolean*/checked){
var checkbox = node.children[1];
var replaceCheckbox = checked ? "checkbox_0" :"checkbox_1";
checkbox.src = checkbox.src.replace(/checkbox_\d/,replaceCheckbox);
checkbox.className = replaceCheckbox;
var index = node.getAttribute("index");
if(!!this.childs[index]){
var length = this.childs[index].length;
this.checks[index] = checked ? length : 0;
if(length > 0){
var children = node.children[3].children;
while(--length >= 0){
this.setJuniorCheckbox(children[length],checked)
}
}
}
},
setPriorCheckbox :function(node,/*Boolean*/checked){//设置上一级树的checkbox
var index = node.getAttribute("index");
var prior = node.parentNode.parentNode;
var priorIndex = this.tree[index][1];
var priorCheckbox = prior.children[1];
var priorLevel = prior.getAttribute("level");
var priorCount = this.checks[priorIndex] || 0;
checked ? priorCount-- : priorCount++;
(priorCount < 0) && (priorCount = 0)
this.checks[priorIndex] = priorCount;
if(!!priorCheckbox){
//当priorIndex等于-1时,
//priorCheckbox不存在
//me.childs[priorIndex]为undefined,不存在长度
checked = (priorCount == this.childs[priorIndex].length);
var replaceCheckbox = checked ? "checkbox_1" : "checkbox_2";
//checkbox_1为全选,checkbox_2为非全选
//全选,则让上级++,即让checked为false
priorCheckbox.src = priorCheckbox.src.replace(/checkbox_\d/,replaceCheckbox);//????????
priorCheckbox.className = replaceCheckbox;
}
if(priorLevel > 0){ //根节点没有priorCheckbox,且priorLevel等于-1
this.setPriorCheckbox(prior,checked);
}
},
isChecked : function(node){//如果是checkbox_0返回false,checkbox_1与checkbox_2返回true
return node.src.slice(-5,-4) > 0;
},
makeImage : function(image){
var status ="";
if(arguments[1] != null){
status = "class='" + arguments[1] +"'";
}
return "<img src='"+this.path+image+".gif' "+status+" />"
},
makeTree : function(index,prefix,level,images,text){
var builder = [];
builder.push("<div index='");
builder.push(index);
builder.push("' prefix='")
builder.push(prefix);
builder.push("' level='")
builder.push(level);
builder.push("'>");
builder.push(images);
builder.push("<span>");
builder.push(text);
builder.push("</span></div>")
return builder.join('');
},
hasSubtree : function (p){
var tree = this.tree;
for(var i = 0,length = tree.length;i < length; i++){
if(this.tree[i][1] == p){
return true;
};
};
return false;
},
getSubtree : function (p){
var subtree = [],tree = this.tree;
for(var i = 0,length = tree.length;i < length; i++){
if(tree[i][1] == p){
subtree.push(tree[i]);
};
};
return subtree
}
}
var data = [
[0,-1,"前台技术"],
[1,0,"表现层"],
[2,1,"CSS"],
[3,2,"CSS资源"],
[4,2,"CSS3前瞻"],
[5,1,"web标准知识"],
[6,1,"图形"],
[7,6,"SVG"],
[8,6,"VML"],
[9,6,"canvas"],
[10,0,"结构层"],
[11,10,"HTML"],
[12,10,"微格式"],
[13,10,"XML"],
[14,13,"XPath"],
[15,0,"行为层"],
[16,15,"core"],
[17,16,"变量与参数"],
[18,16,"对象与继承"],
[19,16,"函数与闭包"],
[20,16,"算法"],
[21,16,"高级技术"],
[22,21,"跨域请求"],
[23,21,"提速技术"],
[24,21,"本地存储"],
[25,21,"函数劫持"],
[26,16,"框架设计"],
[27,26,"Ext"],
[28,26,"dojo"],
[29,26,"mootools"],
[30,15,"Ajax"],
[31,15,"DOM"],
[32,15,"BOM"]
]
window.onload = function(){
var tree = new Tree({renderTo:"test",data:data});
}
</script>
<div id="test"></div>
分享到:
相关推荐
这款js树菜单库提供了多种样式,能满足不同设计需求,无论是在后台管理系统还是在数据分类展示上都能发挥出其优势。 在Ztree中,树形菜单的基本结构由节点组成,每个节点可以包含文本、图标以及子节点等信息。通过...
"JS 树菜单集合(最全)"是针对这一需求提供的资源包,包含多种类型的树菜单实现,适用于不同的场景和设计要求。 树菜单在JS中通常通过DOM操作和事件监听来构建,它们的核心原理是递归地生成和管理节点。"jstree....
"js树菜单源代码集合"是一个汇集了多种JavaScript实现的树形菜单的资源包,提供了丰富的示例和代码片段,对于开发者来说是学习和借鉴的好材料。 这个压缩包中可能包含了各种不同风格和功能的树菜单实现,如静态树...
在JavaScript编程中,树形菜单是一种常见的用户界面元素,它以层级结构展示数据,通常用于网站导航、文件系统浏览或数据库记录的展示。本压缩包包含两个文件:"可以拖动的IEtree树型.htm" 和 "树型结构_lj不错.htm"...
JS树菜单利用JavaScript语言动态构建和操作DOM元素,实现节点的展开、折叠、选择、搜索等功能,为用户提供了直观且易于操作的界面。 ### 一、基本概念 1. **DOM(Document Object Model)**: DOM是HTML和XML文档的...
在标签中,“JS树形菜单”、“JavaScript树形菜单”和“树形菜单”都是对这个技术的关键词描述,强调其基于JavaScript的实现。JavaScript作为客户端脚本语言,使得树形菜单能够在用户的浏览器端动态生成和操作,无需...
在"js树形菜单加右键菜单"这个项目中,我们可以看到两个关键组件的结合。代码文件`code.htm`很可能是实现这一功能的HTML页面,它可能包含了树形菜单的基本结构和右键菜单的触发器。CSS文件`css`则负责定义样式,包括...
以下是一个简单的JavaScript树形菜单的实现示例: ```javascript function renderMenu(data, parentEl) { for (let item of data) { let li = document.createElement('li'); let a = document.createElement('a...
总的来说,构建JavaScript树形菜单涉及的技术包括HTML结构设计、CSS样式控制、JavaScript DOM操作、事件处理、数据结构和算法(如遍历树形结构)、以及可能的异步加载和动画效果。通过这些技术的组合,我们可以创建...
JavaScript树形菜单是一种在网页中实现层次结构数据展示的交互方式,它通常用于导航、文件管理、选项配置等场景。"带复选框"的JS树形菜单则更进一步,允许用户通过勾选复选框来选择或操作树节点,为用户提供了一种...
JS无限级树形菜单3种
在JavaScript(JS)开发中,树菜单和日期选择器是两个常见的UI组件,它们用于增强用户界面的交互性和功能性。本文将深入探讨这两个组件的工作原理、实现方式以及如何在实际项目中应用它们。 首先,我们来看树菜单。...
"js树形菜单"是使用JavaScript编程语言来实现这种功能的技术。JavaScript作为一种强大的客户端脚本语言,能够在用户与网页之间提供实时的交互,使得树形菜单不仅具有视觉吸引力,而且操作起来非常直观。 实现js树形...
JS树形菜单源代码下载,JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码...
JavaScript(简称JS)是一种轻量级的脚本语言,广泛应用于网页和网络应用开发,而树形菜单在前端UI设计中扮演着重要角色,尤其在数据层级结构展示时。JS树形菜单允许用户以交互方式浏览多级数据,提供了一种高效、...
可动态添加/删除节点,启用/不启用复选框,启用连线或不连线,支持自定义ICON图标,可获取当前选中节点参数及父级目录树,可用作级联下拉树菜单等。 可获取HTML中li列表自动生成树菜单(可用作网站多级分类目录) ...
"js树形菜单"就是利用JavaScript技术来创建这种具有多级层次的菜单系统。 树形菜单的核心在于递归和事件处理。在JS中,我们可以使用数组或对象来表示树节点的数据结构,每一层节点都是上一层节点的子节点。例如: ...
javascript树形菜单
综上所述,"一个js树形菜单"项目是一个学习和实践JavaScript核心技能的好例子,它涵盖了数据结构、DOM操作、事件处理、CSS样式等多个方面,对提升Web开发能力大有裨益。通过研究项目中的代码和实现方式,开发者不仅...