利用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 FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 Javascript
setTimeout函数的神奇使用
Feb 26 Javascript
vue过渡和animate.css结合使用详解
Jun 14 Javascript
关于 angularJS的一些用法
Nov 29 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
Apr 04 Javascript
使用异步组件优化Vue应用程序的性能
Apr 28 Javascript
layui自定义插件citySelect实现省市区三级联动选择
Jul 26 Javascript
vue.js实现左边导航切换右边内容
Oct 21 Javascript
JS实现盒子拖拽效果
Feb 06 Javascript
vue中的.$mount('#app')手动挂载操作
Sep 02 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 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
德劲1104的电路分析与改良
2021/03/01 无线电
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
PHP 基本语法格式
2009/12/15 PHP
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
详解php中的implements 使用
2017/06/13 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
利用Python读取txt文档的方法讲解
2018/06/23 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
Python谱减法语音降噪实例
2019/12/18 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
学习党课思想汇报
2013/12/29 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
大四自我鉴定
2014/02/08 职场文书
党支部工作总结2015
2015/04/01 职场文书
调解书格式范本
2015/05/20 职场文书
Python列表的索引与切片
2022/04/07 Python
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript