JXTree对象,读取外部xml文件数据,生成树的函数

  /******************************************

  *JXTree对象,读取外部xml文件数据,生成树

  *@author brull

  *@email [email protected]

  *@date 2007-03-27

  *******************************************/

  /*

  *@param xmlURL XML文件的地址

  */

  var JXTree = function(xmlURL)

  {

  var result = new Array();

  /*****************************

  *首先定义TreeNode抽象对象

  *TreeNode对象属性:

  *id 唯一编号,必须在xml文件里定义为节点属性

  *level 节点层次,从-1开始(即根节点)

  *_click 节点click,在xml文件定义为节点属性[可选]

  *isLast 是否为本节点所在层次最后一个节点

  *parent_isLast 父节点是否为父节点所在层次的最后一个节点

  *toHTML 本节点转成HTML代码的方法

  *******************************/

  var TreeNode = function (node,level)

  {

  var parent_elements = node.parentNode ? (node.parentNode.parentNode ? node.parentNode.parentNode.childNodes : null) : null;

  var elements = node.parentNode ? node.parentNode.childNodes : null;

  this.id = XMLDom.getAttribute(node,"id") ? XMLDom.getAttribute(node,"id") : "";

  this.level = level;//节点的层次

  this.isLast = elements ? ((elements.item(elements.length-2) === node) ? true : false) : false;

  this._click = XMLDom.getAttribute(node,'click') ? XMLDom.getAttribute(node,'click') : "";

  this.toHTML = null;//function

  }

  /*****************************

  *ElementNode对象,继承自抽象对象TreeNode

  *新增属性:

  *_nodeName 节点名称

  ******************************/

  var ElementNode = function(node,level)

  {

  TreeNode.apply(this,arguments);

  this._nodeName = XMLDom.getAttribute(node,"name") ? XMLDom.getAttribute(node,"name") : "";

  this.toHTML = function(){

  var result = "";

  if(this.isLast) result += "<div><div class='minus_bottom'";

  else result += "<div><div class='minus'";

  result += " id='"+this.id+"_join' onclick=\"JXTree.changeState('"+this.id+"')\"></div><div id='"+this.id+"_folder' class='folder_open'></div><span class='text' onclick=\""+this._click+"\">"+this._nodeName+"</span></div>";

  return result;

  }

  }

  /*****************************

  *TexNode对象,继承自抽象对象TreeNode

  *属性和TreeNode一样

  *新增属性:

  *_nodeValue 节点值

  ******************************/

  var TextNode = function(node,level)

  {

  TreeNode.apply(this,arguments);

  this._nodeValue = node.firstChild.nodeValue;

  this.toHTML = function(){

  var result = "";

  if(this.isLast) result += "<div><div class='join_bottom'></div>";

  else result += "<div><div class='join'></div>";

  result += "<div class='page'></div><span class='text' id='"+this.id +"_item' onclick=\"JXTree.setFocus(this.id);"+this._click+"\">"+this._nodeValue+"</span></div>";

  return result;

  }

  }

  /**********Node 节点构建结束,开始解释XML文件************/

  var DOMRoot=XMLDom.loadXML(xmlURL).documentElement;//同步加载XML文件

  var level = -1;//root节点level

  var stack = new Array(1);

  result.push("<div><div class='root'></div><span class='text'>"+XMLDom.getAttribute(DOMRoot,"name")+"</span></div>");

  //解释xml文件内容成树状态展开的HTML代码,递归调用

  this.parseXML = function(node){

  stack.push(level);

  level++;

  var element = new ElementNode(node,level);

  var elements = node.childNodes;

  if(level != 0){

  if(element.isLast)

  result.push("<div id='"+element.id+"_body' class='body_empty'>");

  else

  result.push("<div id='"+element.id+"_body' class='body_line'>");

  }

  for(var i=0;i<elements.length;i++){

  if(elements.item(i).nodeName == "item"){//节点为树叶

  var textNode = new TextNode(elements.item(i),level);

  result.push(textNode.toHTML());

  textNode = null;//及时释放对象

  }

  else if(elements.item(i).nodeType ==1){//节点为树枝

  var elementNode = new ElementNode(elements.item(i),level);

  result.push(elementNode.toHTML());

  elementNode = null;//及时释放对象

  this.parseXML(elements.item(i));

  }

  }

  if(level != 0)result.push("</div>");

  level = stack.pop();

  }

  //得到解释结果并返回

  this.getTree = function(){

  this.parseXML(DOMRoot);

  DOMRoot = null;//释放DOM对象

  return result.join("");

  }

  /*************静态属性***************/

  JXTree.curText = null;//当前文本的id

  /************静态方法***************/

  JXTree.changeState = function (id){//展开或者收缩节点内容

  var _body = document.getElementById(id + "_body");

  var _join = document.getElementById(id+"_join");

  var folder = document.getElementById(id+"_folder");

  (_body.style.display == "none") ? (

  _body.style.display = "block",

  _join.className = _join.className.replace("plus","minus"),

  folder.className = "folder_open"

  ) : (

  _body.style.display = "none",

  _join.className = _join.className.replace("minus","plus"),

  folder.className = "folder_close"

  )

  };//changeState

  JXTree.setFocus = function(id){

  if(JXTree.curText)

  with(document.getElementById(JXTree.curText).style){

  backgroundColor = "";

  color = "#000";

  }

  with(    document.getElementById(id).style){

  backgroundColor = "#003366";

  color = "#FFF";

  }

  JXTree.curText = id;

  }

  }