利用Ext Js生成动态树实例代码


Posted in Javascript onSeptember 08, 2008

一. 需求

要求生成一颗部门树,初始只列出根部门
当点击一个部门节点时,动态载入该部门下的直属子部门,并展开该部门节点
部门节点要求支持右键单击事件,当点击右键时,列出相关操作菜单
二. 关键类

这里主要涉及Ext JS的两个类:

Ext.tree.TreeNode
Ext.menu.Menu
相关API可以参考:http://extjs.com/deploy/ext/docs/

三. 代码示例

1. 先看一下测试页面

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>Reorder TreePanel</title> 
<link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" /> 
<script type="text/javascript" src="../../adapter/ext/ext-base.js"></script> 
<script type="text/javascript" src="../../ext-all.js"></script> 
<script type="text/javascript" src="reorder.js"></script> 
<!-- Common Styles for the examples --> 
<link rel="stylesheet" type="text/css" href="../shared/examples.css" /> 
<link rel="stylesheet" type="text/css" href="../shared/lib.css" /> 

<script type="text/javascript"> 
/************** 
onload事件 
***************/ 
window.onload=function(){ 
createTree(3); 
} 
</script> 

</head> 
<body> 
<script type="text/javascript" src="../shared/examples.js"></script> 
<h1>现在要生成一颗动态树</h1> 
<div id="container"> 
</div> 
</body> 
</html>

2. 再看一下生成树的函数
/*********************************** 
创建树 
by chb 
************************************/ 
function createTree(n){ 
Ext.QuickTips.init(); 
var mytree=new Ext.tree.TreePanel({ 
el:"container", 
animate:true, 
title:"Extjs动态树", 
collapsible:true, 
enableDD:true, 
enableDrag:true, 
rootVisible:true, 
autoScroll:true, 
autoHeight:true, 
width:"30%", 
lines:true 
}); 
//根节点 
var root=new Ext.tree.TreeNode({ 
id:"root", 
text:"集团公司", 
expanded:true 
}); 

for(var i=0;i<n;i++){ 
var sub1=new Ext.tree.TreeNode({ 
id:i+1, 
text:"子公司"+(i+1), 
singleClickExpand:true, 
listeners:{ 
//监听单击事件 
"click":function(node){ 
myExpand(node); 
}, 
//监听右键 
"contextmenu":function(node,e){ 
//列出右键菜单 
menu=new Ext.menu.Menu([ 
{ 
text:"打开当前节点", 
icon:"list.gif", 
handler:function(){ 
myExpand(node); 
} 
}, 
{ 
text:"编辑当前节点", 
icon:"list.gif", 
handler:function(){ 
alert(node.id); 
} 
}, 
{ 
text:"删除当前节点", 
icon:"list.gif", 
handler:function(){ 
alert(node.id); 
} 
}]); 
//显示在当前位置 
menu.showAt(e.getPoint()); 
} 
} 
}); 
root.appendChild(sub1); 
} 
mytree.setRootNode(root);//设置根节点 
mytree.render();//不要忘记render()下,不然不显示哦 
}

3. 展开子节点的代码
/****************************************** 
展开节点 
******************************************/ 
function myExpand(node){ 
if(node.id=='1'){ 
if(node.item(0)==undefined){ 
node.appendChild(new Ext.tree.TreeNode({ 
id:node.id+'1', 
text:node.text+"的第一个儿子", 
hrefTarget:"mainFrame", 
listeners:{//监听 
"click":function(node,e){ 
expand2(node) 
} 
} 
})); 
} 
node.expand(); 

}else if(node.id=='2'){ 
node.appendChild(new Ext.tree.TreeNode({ 
id:node.id+'2', 
text:node.text+"的第一个儿子", 
hrefTarget:"mainFrame", 
listeners:{//监听 
"click":function(node){ 
expand2(node) 
} 
} 
})); 
}else{ 
alert(node.id+"没有子部门了"); 
} 
}

读者可以自己运行一下如上代码,会发现如下现象:无论点击“子公司1”多少次,只会列出“子公司1的第一个儿子”一个节点,而每点击一次“子公司2”,就会多出一个“子公司2的第一个儿子”节点,这是为什么呢?

因为每次点击都会激发myExpand函数,而“子公司1”上加了node.item(0)==undefined的判断,这里明白了?
即:如果该部门下没有子部门,则载入子部门,否则只展开,不重新载入。

好了,就到这里吧,困了,就不详细解释了o(∩_∩)o...哈哈

Javascript 相关文章推荐
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
Aug 13 Javascript
jquery中dom操作和事件的实例学习-表单验证
Nov 30 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
关于JS管理作用域的问题
Apr 10 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 Javascript
JavaScript遍历table表格中的某行某列并打印其值
Jul 08 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
Jun 27 Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
Jul 07 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
Apr 08 Javascript
小程序和web画三角形实现解析
Sep 02 Javascript
JS简单表单验证功能完整示例
Jan 26 Javascript
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
Sep 08 #Javascript
Javascript条件判断使用小技巧总结
Sep 08 #Javascript
SyntaxHighlighter代码加色使用方法
Sep 07 #Javascript
很多人都是用下面的js刷新站IP和PV
Sep 05 #Javascript
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 #Javascript
IE浏览器PNG图片透明效果代码
Sep 02 #Javascript
JavaScript监测ActiveX控件是否已经安装过的代码
Sep 02 #Javascript
You might like
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
基于jquery的跨域调用文件
2010/11/19 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
详解python配置虚拟环境
2019/04/08 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
英国奢侈品牌时尚购物平台:Farfetch(支持中文)
2020/02/18 全球购物
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
自我鉴定范文
2013/11/10 职场文书
经管应届生求职信
2013/11/17 职场文书
应届大学生自荐信
2013/12/05 职场文书
公司培训欢迎词
2014/01/10 职场文书
保险公司年会主持词
2014/03/22 职场文书
开展创先争优活动总结
2014/08/28 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
Python编写nmap扫描工具
2021/07/21 Python
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android