利用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 相关文章推荐
Javascript JSQL,SQL无处不在,
May 05 Javascript
JavaScript日期类型的一些用法介绍
Mar 02 Javascript
Jquery结合HTML5实现文件上传
Jun 25 Javascript
JQuery的attr 与 val区别
Jun 12 Javascript
Angular 应用技巧总结
Sep 14 Javascript
js实现倒计时及时间对象
Nov 15 Javascript
详解堆的javascript实现方法
Nov 29 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
实例详解display:none与visible:hidden的区别
Mar 30 Javascript
vue-cli中的babel配置文件.babelrc实例详解
Feb 22 Javascript
vue v-model实现自定义样式多选与单选功能
Jul 05 Javascript
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
用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将金额数字转化为中文大写
2015/07/09 PHP
php计算年龄精准到年月日
2015/11/17 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
JavaScript File分段上传
2016/03/10 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
node.js通过url读取文件
2020/10/16 Javascript
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
python文本数据相似度的度量
2018/03/12 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
收集的7个CSS3代码生成工具
2010/04/17 HTML / CSS
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
月考总结与反思
2015/10/22 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
Redis入门基础常用操作命令整理
2022/06/01 Redis