posts - 1,  comments - 0,  trackbacks - 0

          想要?jiǎng)討B(tài)的根據(jù)xml文件來(lái)創(chuàng)建一棵Tree,采用dojo的Tree這個(gè)widget來(lái)作為載體實(shí)現(xiàn),本以為很簡(jiǎn)單的工作卻沒(méi)有想到的麻煩。
          1.使用js來(lái)load xml文件

          function loadXML(xmlFile)
          {
              var xmlDoc;
              if(window.ActiveXObject)
              {
                  xmlDoc    = new ActiveXObject('Microsoft.XMLDOM');
                  xmlDoc.async    = false;    //這里千萬(wàn)需要注意,非同步的選項(xiàng),默認(rèn)為true,后面Note 1會(huì)有解釋
                  xmlDoc.load(xmlFile);
              }
              else if (document.implementation&&document.implementation.createDocument)
              {
                  xmlDoc  = document.implementation.createDocument('', '', null);
                  xmlDoc.async=false;
                  xmlDoc.load(xmlFile);
              }
              else
              {
                  return null;
              }
             
              return xmlDoc;
          }

          function checkXMLDocObj(xmlFile)
          {
              var xmlDoc    = loadXML(xmlFile);
              if(xmlDoc==null)
              {
                  alert('Explore do not support xml file load');
              }
              return xmlDoc;
             
          }
           
          function parseXML(xml) {
           var xmlDoc    = checkXMLDocObj("/Tree/data.xml"); // 這里是文件,默認(rèn)根節(jié)點(diǎn)叫做data
           var data = xmlDoc.getElementsByTagName("data");
          createTreeFromXML(data.item(0));   //這里是一個(gè)很tricky的方式取到xml文件的根節(jié)點(diǎn)
          var s = dojo.widget.byId("dataTree").selector;    //發(fā)現(xiàn)動(dòng)態(tài)的給dojo的tree node加selector非常困難,但突然發(fā)現(xiàn)dojo tree默認(rèn)給每一個(gè)節(jié)點(diǎn)都有selector,所以直接取來(lái)用
          dojo.event.connect(s, 'select', 'treeNodeSelected');    //就是一個(gè)字了,爽
          }

          function createTreeFromXML(root) {
            var tree = dojo.widget.byId("dataTree");
            if(tree == null)
             alert("null");              
            else
             tree.destroy();
            tree = dojo.widget.createWidget("Tree", {id: "dataTree", toggle: "wipe", expandLevel: 3});          //創(chuàng)建tree
            dojo.byId("tree").appendChild(tree.domNode);                                                                          /放置tree
            
            var rootNode = dojo.widget.createWidget("TreeNode", {title: root.localName});
            tree.addChild(rootNode);
            appendChild(root,rootNode);          //開(kāi)始循環(huán)遞歸的創(chuàng)建tree的子節(jié)點(diǎn)
           }
           
           function appendChild(father,fatherTreeNode) {
            var sub;
            var subTreeNode;
            if(window.ActiveXObject) {
             for(var i = 1; i < father.childNodes.length; i=i++) {            //這里有一個(gè)很惡心的事情,就是ie 和firefox了,一個(gè)父節(jié)點(diǎn),在ie中g(shù)et the child nodes,works fine
              sub = father.childNodes[i];
              var title = sub.localName;             
              subTreeNode = dojo.widget.createWidget("TreeNode",{title: title});             
              fatherTreeNode.addChild(subTreeNode);
              appendChild(sub,subTreeNode,objectID);
             }
            }
            else {
             for(var i = 1,j=1; i < father.childNodes.length; i=i+2,j++) {    // 在firefox中獲取,要間隔為2,中間總是多出一個(gè)濫竽充數(shù)的家伙
              sub = father.childNodes[i];
              var title = sub.localName;                                                     //使用localName屬性
              subTreeNode = dojo.widget.createWidget("TreeNode",{title: title});    //生成新的子節(jié)點(diǎn)
              fatherTreeNode.addChild(subTreeNode);                                      
              appendChild(sub,subTreeNode);                                                        //遞歸
             }
            }
            return;
           }

          Note:
          1. 在load xml文件的時(shí)候非同步參數(shù)一定要設(shè)置為false,否則很可能會(huì)發(fā)生在xml文件還沒(méi)有l(wèi)oad完之后就調(diào)用處理從而發(fā)生找不到節(jié)點(diǎn)的error
          2. ie和firefox的dom child node 問(wèn)題也值得注意,以后會(huì)再研究一下問(wèn)什么會(huì)發(fā)生這種問(wèn)題。

          posted @ 2007-08-20 13:45 IamEriK 閱讀(725) | 評(píng)論 (0)編輯 收藏
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          搜索

          •  

          最新評(píng)論

          主站蜘蛛池模板: 彭泽县| 海原县| 拜泉县| 浦江县| 喀喇| 浏阳市| 瓦房店市| 隆尧县| 句容市| 民权县| 北海市| 炉霍县| 合水县| 宕昌县| 吉隆县| 芮城县| 大同县| 朝阳市| 顺平县| 鄂托克前旗| 乐昌市| 株洲市| 万载县| 航空| 麦盖提县| 汉阴县| 兴宁市| 兴文县| 台州市| 沙雅县| 黄山市| 博湖县| 蒙城县| 新津县| 明星| 公主岭市| 江北区| 井研县| 门源| 抚松县| 湖口县|