一:根据树代码定位树某个节点
调用处
var tree = Ext.getCmp('selecttree');
var rootNode = tree.getRootNode();
//vulue是动态输入的需要定位的代码
focusTreeNodeFunc(rootNode,value);按代码严格定位
实现方法
/**
* 递归算法定位树节点
*/
function focusTreeNodeFunc(node,value,focusFlag){
for (var i = 0; i < node.childNodes.length; i++) {
var subNode = node.childNodes[i];
var text = '';
if (focusFlag == 'code')
text = subNode.id;
else if (focusFlag == 'name')
text = subNode.text;
if (text == value){
var nodeArr = new Array();
getNeedExpandNode(subNode,nodeArr);
doNeedExpandNode(nodeArr);
if (subNode.hasChildNodes())
subNode.expand();
subNode.select();
subNode.getUI().getEl().scrollIntoView();
break;
}else{
if (subNode.hasChildNodes()){
focusTreeNodeFunc(subNode,value,focusFlag);
}
}
}
}
/**
* XDY
* 获取所有需要展开的父节点。
* @param curNode
* @param nodeArr
* @return
*/
function getNeedExpandNode(curNode,nodeArr){
var parentNode;
if (curNode.parentNode != undefined && curNode.parentNode!=null){
if ((curNode.parentNode.isExpanded() ==false) && (curNode.parentNode.hasChildNodes())){
parentNode = curNode.parentNode;
if (parentNode.text != '##')
nodeArr.push(parentNode);
}
}
//递归获取所有的上级节点
if ((parentNode != undefined) && (parentNode.parentNode.text != '##'))
getNeedExpandNode(parentNode,nodeArr);
}
/**
* XDY
* 展开需要的所有父节点
* @param nodeArr
* @return
*/
function doNeedExpandNode(nodeArr){
//展开的时候只能从上往下逐级展开,所以倒序循环
for(var i=nodeArr.length-1;i >=0;i--){
var needExpandNode = nodeArr[i];
needExpandNode.expand();
}
}
二:根据树名称连续定位
调用处
function nextClickFunc(focusCombobox,uuid){
var comboboxValue = focusCombobox.value;
var value = Ext.getCmp(uuid).getValue();
if (isEmpty(value)) return;
var tree = Ext.getCmp('selecttree');
var rootNode = tree.getRootNode();
var arr = focusTreeNodeByFuzzy(rootNode,value,findindex,comboboxValue);//模糊定位
if(arr!=null){
var node = arr[0];
findindex = arr[1];
if(node!=null){
var nodeArr = new Array();
getNeedExpandNode(node,nodeArr);
doNeedExpandNode(nodeArr);
if (node.hasChildNodes())
node.expand();
node.select();
node.getUI().getEl().scrollIntoView();
}
}
}
实现方法
/**
* 模糊定位树节点
* @param node
* @param name
* @param index
* @return
*/
var findindex = 0;
function focusTreeNodeByFuzzy(node,name,index,focusFlag){
var arr = new Array();
var c = -1;
while(node){
c++;
var temp=node;
var showName = '';
if (focusFlag == 'code')
showName = node.id;
else if (focusFlag =='name')
showName = node.text;
if(showName.indexOf(name)<0 || c<=index){
if (!node.lastChild){
if (node.nextSibling)
node = node.nextSibling;
else if (!node.nextSibling && node.parentNode)
node = node.parentNode.nextSibling;
else
node = node.nextSibling;
}else{
node = node.firstChild;
}
if(!node){
node=temp;
while(node.parentNode && node.parentNode.parentNode && !node.nextSibling){
node=node.parentNode;
}
node=node.nextSibling;
}
}else{
arr.push(node);
arr.push(c);
return arr;
}
}
return null;
};