日期:2014-05-16 浏览次数:20585 次
????? 前言:在任何一个Tree树中,提供查找功能无疑会大大方便用户。不用睁大眼睛一级一级去展开,只要输入关键字,回车就能自动定位到节点,岂不快哉?这样的用户体验是相当完美的。但在动态异步加载 的Tree树中,客户端实现这样的功能就有点困难,因为节点是异步动态加载的。默认是没有全部从服务器端取回 的,通常的做法是默认加载第一级,其他级的节点都是惰性按需加载的,用户点了才会展开。而对于这个没有完全加载的树,用户希望搜索节点,怎么实现?笨办法是先展开树的所有节点,然后再在树中搜索 。这样的话在服务器数据量大的情况下会非常慢。所以在数据量大的情况下,是不采取这种实现方式的,这里的实现方法是在服务器端的Servlet中查找,通过AJAX返回第一个匹配节点的路径Path,然后展开这个路径,选中这个搜索到节点 。
效果图:

?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
???????? 一、 先展开树的所有节点,然后再在树中搜索
?
Ext.onReady(function() {
Ext.QuickTips.init();
Ext.BLANK_IMAGE_URL = "../../resources/images/default/s.gif";
var mytree = new Ext.tree.TreePanel({
region: 'center',
title : "简单Extjs动态树",
//el : "container",
animate : true, //展开,收缩动画,false时,则没有动画效果
collapsible : true,
enableDD : true,//不仅可以拖动,还可以通过Drag改变节点的层次结构(drap和drop)
enableDrag : true,//仅仅drop
rootVisible : true,//false不显示根节点,默认为true
autoScroll : true,
autoHeight : true,
width : 150,
//tbar:new Ext.Toolbar(),
tbar:[' ',
new Ext.form.TextField({
width:150,
emptyText:'快速检索',
enableKeyEvents: true,
listeners:{
keyup:function(node, event) {
findByKeyWordFiler(node, event);
},
scope: this
}
})
],
root:new Ext.tree.AsyncTreeNode({
id:"root",
text:"树的根",
leaf:false,
//expanded:true,
children: [{
id: 'level',
text: '用户类型',
children: [{
id: 'allLevel',
text: '全部',
leaf: true
}, {
id: 'noSupport',
text: '无支持',
leaf: true
}, {
id: 'month',
text: '包月',
leaf: true
}, {
id: 'year',
text: '包年',
leaf: true
}, {
id: 'always',
text: '终身',
leaf: true
}]
}, {
id: 'outOfDate',
text: '是否过期',
children: [{
id: 'allOutOfDate',
text: '全部',
leaf: true
}, {
id: 'notOutOfDate',
text: '未过期',
leaf: true
}, {
id: 'alreadyOutOfDate',
text: '已过期',
leaf: true
}]
}, {
id: 'report',
text: '统计图表',
children: [{
id: 'levelReport',
text: '按用户类型',
leaf: true
}, {
id: 'outOfDateReport',
text: '按是否过期',
leaf: true
}]
}]
}),
lines : true//节点间的虚线条
});
//mytree.expandAll();
//mytree.render();
/*
var filterTreeFiled = new Ext.form.TextField({
width:150,
emptyText:'快速检索',
enableKeyEvents: true
});
var tbar = mytree.getTopToolbar();
tbar.add(filterTreeFiled);
tbar.doLayout();*/
var timeOutId = null;
var treeFilter = new Ext.tree.TreeFilter(mytree, {
clearBlank : true,
autoClear : true
});
// 保存上次隐藏的空节点
var hiddenPkgs = [];
var findByKeyWordFiler = function(node, event) {
clearTimeout(timeOutId);// 清除timeOutId
mytree.expandAll();// 展开树节点
// 为了避免重复的访问后台,给服务器造成的压力,采用timeOutId进行控制,如果采用treeFilter也可以造成重复的keyup
timeOutId = setTimeout(function() {
// 获取输入框的值
var text = node.getValue();
// 根据输入制作一个正则表达式,'i'代表不区分大小写
var re = new