// 1.第一步:增加一个搜索框到TreePanel tbar
tbar:[‘ ‘,
new Ext.form.TextField({
width:350,
emptyText:‘请输入关键字检索‘,
enableKeyEvents: true,
listeners:{
keyup:function(node, event) {
findByKeyWordFiler(node, event);
},
scope: this
}
})
],
// 2.第二步:增加搜索方法
//--------------Tree filter implement---------------BEG
var treeFilter = new Ext.tree.TreeFilter(tree, {
clearBlank : true,
autoClear : true
});
var timeOutId = null;
var hiddenPkgs = [];
var findByKeyWordFiler = function(node, event) {
clearTimeout(timeOutId);// 清除timeOutId
tree.expandAll();// 展开树节点
// 为了避免重复的访问后台,给服务器造成的压力,采用timeOutId进行控制,如果采用treeFilter也可以造成重复的keyup
timeOutId = setTimeout(function() {
// 获取输入框的值
var text = node.getValue();
// 根据输入制作一个正则表达式,‘i‘代表不区分大小写
var re = new RegExp(Ext.escapeRe(text), ‘i‘);
// 先要显示上次隐藏掉的节点
Ext.each(hiddenPkgs, function(n) {
n.ui.show();
});
hiddenPkgs = [];
if (text != "") {
treeFilter.filterBy(function(n) {
// 只过滤叶子节点,这样省去枝干被过滤的时候,底下的叶子都无法显示
return !n.isLeaf() || re.test(n.text);
});
// 如果这个节点不是叶子,而且下面没有子节点,就应该隐藏掉
tree.root.cascade(function(n) {
if(n.id!=‘0‘){
if(!n.isLeaf() &&judge(n,re)==false&& !re.test(n.text)){
hiddenPkgs.push(n);
n.ui.hide();
}
}
});
} else {
treeFilter.clear();
return;
}
}, 500);
}
// 过滤不匹配的非叶子节点或者是叶子节点
var judge =function(n,re){
var str=false;
n.cascade(function(n1){
if(n1.isLeaf()){
if(re.test(n1.text)){ str=true;return; }
} else {
if(re.test(n1.text)){ str=true;return; }
}
});
return str;
};
});
//--------------Tree filter implement---------------END
原文:http://my.oschina.net/moks/blog/524947