A-A+

JavaScript使用结构树显示XML数据

2018年02月17日 脚本 阅读 865 views 次

本文展示使用JavaScript解析XML数据文件,并以树形结构显示XML数据。当节点包含下级数据时,实现结构树节点的展开和折叠。最终的页面效果如下图所示:

实现的JavaScript代码如下所示:

  1. function createXMLDom() //创建XMLDOM对象函数,跨浏览器解决方案
  2. {
  3.     var xmlDom;
  4.     if (window.ActiveXObject) //IE
  5.     {
  6.         xmlDom = new ActiveXObject("Microsoft.XMLDOM");
  7.         xmlDom.async = false;
  8.         xmlDom.load("menu.xml");
  9.         if (xmlDom.parseError.errorCode != 0)
  10.         {
  11.             window.alert("XML文件加载错误. errorCode:" + xmlDom.parseError.errorCode + " reason:" + xmlDom.parseError.reason);
  12.             return false;
  13.         }
  14.         else
  15.         {return xmlDom;}
  16.     }
  17.     else if (document.implementation && document.implementation.createDocument) //FireFox
  18.     {
  19.         xmlDom = document.implementation.createDocument("","",null);
  20.         xmlDom.async = false;
  21.         xmlDom.load("menu.xml");
  22.         return xmlDom;
  23.     }
  24.     else
  25.     {
  26.         window.alert("不支持XMLDOM对象");
  27.         return false;
  28.     }
  29. }
  30. function treeMenu(ulID)
  31. {
  32.     var xmlDom = createXMLDom(); //创建XMLDOM对象
  33.     var menu = xmlDom.documentElement; //xml文档根节点
  34.     var rootLevels = menu.getElementsByTagName("rootLevel"); //一级分类集合
  35.     var ul = document.getElementById(ulID);
  36.     for (var i=0;i<rootLevels.length;i++) //循环显示一级分类
  37.     {
  38.         var selfID = rootLevels[i].getAttribute("id");
  39.         var selfName = rootLevels[i].getElementsByTagName("selfName")[0].firstChild.nodeValue;
  40.         var li = document.createElement("li");
  41.         li.innerHTML = selfName;
  42.         li.id = selfID;
  43.         var levels = rootLevels[i].getElementsByTagName("level"); //集合
  44.         if (levels.length > 0) //有子类
  45.         {
  46.             li.className = "plus";
  47.             li.onclick = function () {liClick(this,this.id,xmlDom);} //单击事件
  48.         }
  49.         else //无子类
  50.         {
  51.             li.className = "item";
  52.         }
  53.         ul.appendChild(li);
  54.     }
  55. }
  56. function liClick(li,id,xmlDom,event)
  57. {
  58.     var childUL = li.getElementsByTagName("ul"); //ul集合
  59.     if (childUL.length > 0)//折叠
  60.     {closeChild(li,childUL);}
  61.     else //展开
  62.     {openChild(li,id,xmlDom);}
  63.     cancelBuble(event); //plus停止事件冒泡
  64. }
  65. function openChild(li,id,xmlDom) //展开函数
  66. {
  67.     li.className = "minus"//折叠图标
  68.     var levels = xmlDom.documentElement.getElementsByTagName("level"); //level集合
  69.     var ul = document.createElement("ul");
  70.     for (var m=0;m<levels.length;m++)
  71.     {
  72.         var selfID = levels[m].getAttribute("id");
  73.         var selfName = levels[m].getElementsByTagName("selfName")[0].firstChild.nodeValue;
  74.         var parentID = levels[m].getElementsByTagName("parentID")[0].firstChild.nodeValue;
  75.         if (id == parentID) //属于id子类
  76.         {
  77.             var ulli = document.createElement("li");
  78.             ulli.innerHTML = selfName;
  79.             ulli.id = selfID;
  80.             var childLevels = levels[m].getElementsByTagName("level"); //集合
  81.             if (childLevels.length > 0) //有子类
  82.             {
  83.                 ulli.className = "plus";
  84.                 /*停止事件冒泡,跨浏览器解决方案 Start*/
  85.                 if (window.ActiveXObject) //IE
  86.                 {ulli.onclick = function () {liClick(this,this.id,xmlDom,event);}} //单击事件
  87.                 else //FireFox
  88.                 {ulli.onclick = function (event) {liClick(this,this.id,xmlDom,event);}} //单击
  89.                 /*停止事件冒泡,跨浏览器解决方案 End*/
  90.             }
  91.             else //无子类
  92.             {
  93.                 ulli.className = "item";
  94.                 /*停止事件冒泡,跨浏览器解决方案 Start*/
  95.                 if (window.ActiveXObject) //IE
  96.                 {ulli.onclick = function () {cancelBuble(event);}} //item停止事件冒泡
  97.                 else //FireFox
  98.                 {ulli.onclick = function (event) {cancelBuble(event);}} //item停止事件冒泡
  99.                 /*停止事件冒泡,跨浏览器解决方案 End*/
  100.             }
  101.             ul.appendChild(ulli);
  102.         }
  103.     }
  104.     li.appendChild(ul);
  105. }
  106. function closeChild(li,childUL) //折叠函数
  107. {
  108.     li.className = "plus"//展开图标
  109.     for (var j=0;j<childUL.length;j++) //循环删除ul,ul可能有子ul、li孙ul、li
  110.     {childUL[j].parentNode.removeChild(childUL[j]);}
  111. }
  112. function cancelBuble(domEvent) //停止事件冒泡函数,跨浏览器解决方案
  113. {
  114.     if (window.ActiveXObject) //IE
  115.     {domEvent.cancelBubble = true;}
  116.     else //FireFox
  117.     {domEvent.stopPropagation();}
  118. }
个人公众号“数字化设计CAX联盟”,欢迎关注,共同交流
标签:
为您推荐:

给我留言

© 坐倚北风 版权所有 严禁镜像复制 苏ICP备15034888号. 基于 Ality 主题定制 AliCMS
联系邮箱:leanwind@163.con,微信公众号:数字化设计CAX联盟

用户登录

分享到: