页面中用到了MzTreeView,费尽就牛二虎之力,实现了节点定位(主要是通过页面输入框输入的节点名称<不是节点ID>,用JSON实现后台检索DB,得到一个节点ID,再用focus进行定位),虽然还有借个Bug,基本上实现了节点定位,中间修改了原来MzTreeView的mztreeview.js中focu方法以及mzdata.js中的getNodeById方法。还加了两个方法,代码如下:
MzTreeView.prototype.focus = function(id)
{
  var reg=new RegExp("^[0-9]*[1-9][0-9]*$");
  if (reg.test(id)){
  if(!this.selectedNode) this.selectedNode=this.rootNode;
var pathList = this.getPath(id);
var n;
for(i=0; i<pathList.length; i++){
var parent =pathList[i];
n = this.getNodeById(parent);
if(id != parent){
this.expand(parent)
}
}
  }else{
  alert("Please input numbers!")
  }
if(n != null)n.focus();
};MzData.prototype.getNodeById = function(id)
{
  if(id==this.rootId&&this.rootNode.virgin) return this.rootNode;
  var _=this.get__(), d = this.dividerEncoding;
  var reg=new RegExp("([^"+_+ d +"]+"+ d + id +")("+_+"|$)");
  if(reg.test(this.indexes)){
  var s=RegExp.$1;
  var ids=s.split("_");
  this.rootNode;
  if(id==ids[1]){
  s=this.dataSource[s].getAttribute("index_"+ this.hashCode)
  return this.nodes[s];
  }else{
  System._alert("The node isn't initialized!");
  return null;
  }
  }
  alert("sourceId="+ id +" is nonexistent!"); return null;
};添加了两个方法,机能是寻找节点到根节点的路径:
// 获取父节点ID
MzData.prototype.getNodeId = function(sourceId){
  if(sourceId==this.rootId&&this.rootNode.virgin) return null;
  var _=this.get__(), d = this.dividerEncoding;
  var reg=new RegExp("([^"+_+ d +"]+"+ d + sourceId +")("+_+"|$)");
  if(reg.test(this.indexes)){
  var s=RegExp.$1;
  var ids=s.split("_");
  return ids;
  }
  alert("sourceId="+ sourceId +" is nonexistent!");return null;
};

// 获取节点路径
MzData.prototype.getPath = function(id)
{
var result = new Array();
var tmp = new Array();
var nodeId=this.getNodeId(id);
var i=0;
if(("-1" != nodeId[0])){
while(true){
if("-1" != nodeId[0]){
tmp[i]=nodeId[1];
nodeId = this.getNodeId(nodeId[0]);
i++;
}else{
break;
}
}
}else {
tmp[i]=id;
}
var k=0;
for(j=tmp.length-1;j>=0;j--){
result[k]=tmp[j];
k++;
}
return result;
}定位之后,发现定位展开的根节点点击鼠标时,不能再收起来了,请高手协助一下,谢谢!!

解决方案 »

  1.   

    定位问题自己搞定了,在原来的Focus中修改了一下:
    MzTreeView.prototype.focus = function(id)
    {
      var reg=new RegExp("^[0-9]*[1-9][0-9]*$");
      if (reg.test(id)){
      if(!this.selectedNode) this.selectedNode=this.rootNode;
    var pathList = this.getNodeId(id);
    alert(pathList);
    var n;
    this.focusNodeByPath(pathList);  }else{
      alert("Please input numbers!")
      }
    if(n != null)n.focus();
    };