[转载]XML to tree XML 树

[转载]XML to tree XML 树 – 柴哥 – 博客园.

前面发了一个 html to tree 再发一个 xml to tree

以下为代码:

/*
版权所有:版权所有(C) 2009
系统名称:树型控件
文件名称:xml2tree.js
作  者:DEVIN
完成日期:2009-12-22
压缩方式:jspacker
主    页:http://www.chaige.net
*/
var XML2Tree = function (ini) {
var $ = document, _this = this, $$ = 'documentElement';
this.getTitle = ini.getTitle || String;
this.click = ini.click || String;
this.box = ini.shell.big ? $.getElementById(ini.shell) : ini.shell;
this.edit = ini.edit ? true : false;
this.color = ini.color ? ini.color : '#v';
this.row = ini.row ? ini.row : '';
this.box.innerHTML = '
<p style="margin-left: 10px;"><img src="/load3.gif" alt="" /> loading...</p>
';
this.getValue = ini.getValue || String;
/* 异步下载Xml (chrome不能创建XMLDOC,使用Ajax构造) */
this.xml = !!$.all ? (new ActiveXObject('Microsoft.XMLDOM')) : (new XMLHttpRequest());
this.xml.onreadystatechange = function () {
if (_this.xml.readyState == 4) {
_this.box.innerHTML = '';
_this.addSub($.all ? _this.xml[$$] : _this.xml.responseXML[$$], _this.box)
}
}
if (!!$.all) {
this.xml.async = true; this.xml.load(ini.url)
}
else {
this.xml.open("GET", ini.url, true); this.xml.send(null)
};
}
/*
共享接口
*/
XML2Tree.prototype = {
folder: function (node) {
var UI = function (_) { return document.createElement(_) }
, caption = UI('DT'), shell = UI('DL'), body = UI('DD'), $ = XML2Tree.ini;
shell.appendChild(caption);
shell.appendChild(body);
var folderIco = this.selectIco($.folder, $.node, XML2Tree.hasChild(node));
caption.innerHTML = (this.edit ? '<label>' + this.expand(this.getValue.call(node)) + '</label>' : '')
+ this.getLineIco(node) + this.getHasIco(node)
+ folderIco + '<a href="javascript://"><span>'
+ this.getTitle.call(node) + '</span></a>';
caption.mapNode = node;
var co = this.color;
caption.onmouseover = function () {
this.style.backgroundColor = co;
}
caption.onmouseout = function () {
this.style.backgroundColor = '';
}
return { 'shell': shell, 'caption': caption };
},
addSub: function (node, shell) {
if (node == null) return;
var nodes = node.childNodes, _tree = this;
for (var i = 0; i &lt; nodes.length; i++) {
if (nodes[i].nodeType != 1) continue; /* for FF find textNode */
var _ = this.folder(nodes[i]);
shell.appendChild(_.shell);
_.caption.onclick = function (e) {
var $ = XML2Tree, childShell = $.next(this);
if (this.mapNode) {
var wrap = this.parentNode.getElementsByTagName('DD')[0];
if (XML2Tree.hasChild(this.mapNode)) {
_tree.addSub(this.mapNode, wrap);
$.toggle(this, true)
};
this.mapNode = null;
} else {
if (!childShell) return;
if (XML2Tree.hasChild(childShell)) {
var hide = childShell.style.display == 'none';
childShell.style.display = hide ? '' : 'none';
$.toggle(this, hide);
};
};
e = e || window.event;
var sE = e.srcElement || e.target;
if (sE.tagName.toUpperCase() == 'SPAN') {
var title = sE.innerHTML;
if (!XML2Tree.hasChild(childShell)) {
_tree.click.call(sE, title, false); /* 叶节点单击, this 重置为 span */
} else {
_tree.click.call(childShell, title, true); /* 文件夹节点单击, this 重置为 子节点的壳DD */
}
}
};
};
},
getLineIco: function (node) {
var icos = [], root = node.ownerDocument;
if (!root) return null;
node = node.parentNode;
while (node.parentNode != root) {
var $ = XML2Tree, img = this.selectIco($.ini.line, $.ini.empty, !!$.next(node));
icos = [img].concat(icos);
node = node.parentNode;
}
return icos.join('');
},
getHasIco: function (node) {
var last = !!XML2Tree.next(node), $ = XML2Tree.ini;
return XML2Tree.hasChild(node) ?
this.selectIco($.plus, $.plusBottom, last) :
this.selectIco($.join, $.joinBottom, last)
},
expand: function (i) {
var r = this.row, s = [];
for (var k = 0; k &lt; r.length; k++) {
var url = r[k][0].replace('{0}', i);
s.push('<a href="' + url + '">' + r[k][1] + '</a>' + (k == r.length - 1 ? '' : ' | '));
}
return s.join('');
},
selectIco: function (_1, _2, bool) {
return '<img src="' + (bool ? _1 : _2) + '" alt="" align="absimddle" />'
}
};
/*
静态接口
*/
XML2Tree.ini = {
root: 'ui/base.gif',
folder: 'ui/folder.gif',
folderOpen: 'ui/folderopen.gif',
node: 'ui/page.gif',
empty: 'ui/empty.gif',
line: 'ui/line.gif',
join: 'ui/join.gif',
joinBottom: 'ui/joinbottom.gif',
plus: 'ui/plus.gif',
plusBottom: 'ui/plusbottom.gif',
minus: 'ui/minus.gif',
minusBottom: 'ui/minusbottom.gif',
nlPlus: 'ui/nolines_plus.gif',
nlMinus: 'ui/nolines_minus.gif'
};
/* 图标预载 */
XML2Tree.prevLoad = function () {
for (var key in this.ini) {
var $ = new Image();
$.src = this.ini[key];
}
};
XML2Tree.next = function (node) {
var $ = node, _ = 'nextSibling';
for ($ = $[_]; $; $ = $[_]) {
if ($.nodeType == 1) { return $ }
};
return null;
};
XML2Tree.hasChild = function (node) {
var $ = node.childNodes;
for (var i = 0; i &lt; $.length; i++)
if ($[i].nodeType == 1) return true;
return false;
};
XML2Tree.toggle = function (node, isOpen) {
var imgs = node.getElementsByTagName('IMG')
, f = imgs.length - 1, $ = XML2Tree.ini;
imgs[f].src = isOpen ? $.folderOpen : $.folder;
if (this.next(node.parentNode)) {
imgs[f - 1].src = isOpen ? $.minus : $.plus;
} else {
imgs[f - 1].src = isOpen ? $.minusBottom : $.plusBottom;
}
};
/*
生成实例树
参数:
url: xml 地址
shell: 树容器
loading: 下载中的效果html
getTitle: 标题来源属性操作 this 重置为 xml node
chick: 节点或者叶节点的单击事件(可得到参数title,isFolder与重置后的this)
*/
XML2Tree.prevLoad();

下载地址

点我下载

~!~~~ 民工的命

原创代码,转载请联系 柴哥!!!

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏