一直觉得短信平台中群发短信时通讯簿的选择号码方式不太好用,因此想找一个好用的
tree
控件。用过
dtree
,简单但功能不够强大(节点不能带
checkbox
)。所以就试了下大名鼎鼎的
ext
库,其中的
treepanel
果然十分强大,完全满足我的需要:
1、
节点带
checkbox
,方便选择多个号码;
2、
当选择
/
反选父节点时,自动选择
/
反选其下的所有子节点;
3、
树的模型数据可以来自
json
,也可以来自
xml
;
4、
Ext
库对事件的支持十分全面,如特有的
checkchange
事件;
5、
跨浏览器支持,目前在
ie
和
firefox
下都调试通过。
一、准备工作
1
、首先需要下载
ext
库,我目前使用的版本是
ext-2.2.1.zip
,解压缩后,我们需要的只是以下几个目录和文件:
Adaper/ext
Resource
ext-all.js
ext-all-debug.js
ext-core.js
ext-core-debug.js
在应用程序发布目录下建一个
extjs
目录,然后把上述内容拷贝至其中。
2
、另外,要正确解析
json
,我们还需要
org.json.jar
这个包。把它拷贝到
web-inf/lib
目录下。
3
、示例程序。在应用程序发布目录下建一个
tree
目录,把
tree.jsp
和
treesample.jsp
放到其中。
二、在页面中引用
ext
库,并使用
treepanel
组件
打开
tree.jsp
页面,首先如果你不想看到菜单里的中文都变成一堆乱码的话,在
第一行加上:
<%@ page contentType="text/html;
charset=gbk" %>
然后是导入
ext
库,注意
href
中的脚本位置,如果你的
ext
库所在位置跟本文不一样,请修改它,其中
ext-all-debug.js
在发布时可以改为
ext-all.js
:
<link rel="stylesheet"
type="text/css"
href="../extjs/resources/css/ext-all.css">
<script type="text/javascript"
src="../extjs/adapter/ext/ext-base.js"></script>
<script type="text/javascript"
src="../extjs/ext-all-debug.js"></script>
接下来是在脚本中生成
ext
treepanel
组件:
Ext.BLANK_IMAGE_URL =
'../extjs/resources/images/vista/s.gif'; //
选择模板
:vista
var tree = null;
Ext.onReady(function(){
var Tree = Ext.tree;
tree = new Tree.TreePanel({
el:'tree-div',
//
树显示的位置
,dom
元素的
id
autoScroll:true,
animate:false,
enableDD:false,
//
是否支持拖拽
containerScroll:
true,
loader:
new Tree.TreeLoader({
dataUrl:'treesample.jsp'
})
,
rootVisible: false
});
注意其中红色字体部分,
TreeLoader
通过
ajax
方式请求一个
url
,以获得树的
model
。
Model
的数据类型可以是
json
,也可以是
xml
。本文采用
json
方式。
当然,为了达到更好的效果,还定义了一个
ext
事件,用于实现勾选
/
反选父节点时自动勾选
/
反选所有子节点:
tree.on('checkchange', function(node,
checked) {
node.expand();
node.attributes.checked =
checked;
node.eachChild(function(child) {
child.ui.toggleCheck(checked);
child.attributes.checked = checked;
child.fireEvent('checkchange', child, checked);
});
}, tree);
另外定义的两个
js
函数,一个实现打印选择的所有节点的
id
值,一个实现展开
/
折叠全部子节点,根据需要进行定义。
最后,需要在
body
中定义
tree
需要显示的位置:
<div id="tree-div"
style="overflow:auto; height:300px;width:300px;border:1px solid
c3daf9;"></div>
三、获取节点数据
Treepanel
需要的节点数据由
treesample.jsp
提供,大部分的代码集中在这里。其实也很简单,就是从数据库中
select
数据,然后通过
org.json.JSONArray
和
org.json.JSONObject
对象构造一个
json
树组,具体内容看源代码。
杨宏焱
2009-12-4
详细源代码、ext库、jar包等都已经上传到资源
里。