js编写树形控件

以下是引用片段:
这个树型菜单的代码简单一点。
<script language="JavaScript">
NS4 = (document.layers) ? 1 : 0;
IE4 = (document.all) ? 1 : 0;
ver4 = (NS4
IE4) ? 1 : 0;

if (ver4) {
with (document) {
write("<STYLE TYPE='text/css'>");
if (NS4) {
write(".parent {position:absolute; visibility:visible}");
write(".child {position:absolute; visibility:visible}");
write(".regular {position:absolute; visibility:visible}")
}
else {
write(".child {display:none}")
}
write("</STYLE>");
}
}

function getIndex(el) {
ind = null;
for (i=0; i<document.layers.length; i++) {
whichEl = document.layers;
if (whichEl.id == el) {
ind = i;
break;
}
}
return ind;
}

function arrange() {
nextY = document.layers[firstInd].pageY +document.layers[firstInd].document.height;
for (i=firstInd+1; i<document.layers.length; i++) {
whichEl = document.layers;
if (whichEl.visibility != "hide") {
whichEl.pageY = nextY;
nextY += whichEl.document.height;
}
}
}

function initIt(){
if (!ver4) return;
if (NS4) {
for (i=0; i<document.layers.length; i++) {
whichEl = document.layers;
if (whichEl.id.indexOf("Child") != -1) whichEl.visibility = "hide";
}
arrange();
}
else {
divColl = document.all.tags("DIV");
for (i=0; i<divColl.length; i++) {
whichEl = divColl(i);
if (whichEl.className == "child") whichEl.style.display = "none";
}
}
}

function expandIt(el) {
if (!ver4) return;
if (IE4) {
whichEl = eval(el + "Child");
if (whichEl.style.display == "none") {
whichEl.style.display = "block";
}
else {
whichEl.style.display = "none";
}
}
else {
whichEl = eval("document." + el + "Child");
if (whichEl.visibility == "hide") {
whichEl.visibility = "show";
}
else {
whichEl.visibility = "hide";
}
arrange();
}
}
onload = initIt;
</script>
</font></p>
<div id="KB1Parent" class="parent"><a href="#" ><img

src="UpFile/2008-5/3/200853191926454.gif" border=0>文件夹一</a></div>
<div id="KB1Child" class="child"><a href="sample.htm" target="_blank" ><img

src="UpFile/2008-5/3/200853191926914.gif" border=0 alt=""><img src="UpFile/2008-5/3/200853191926406.gif" border=0>页面一</a><br>
<a href="sample.htm" target="_blank" ><img src="UpFile/2008-5/3/200853191926914.gif" border=0 alt="" width="15"

height="11"><img src="UpFile/2008-5/3/200853191926406.gif" border=0>页面二</a><br>
<a href="sample.htm" target="_blank" ><img src="UpFile/2008-5/3/200853191926914.gif" border=0 alt="" width="15"

height="11"><img src="UpFile/2008-5/3/200853191926406.gif" border=0>页面三</a></div>
<div id="KB2Parent" class="parent"><a href="#" ><img

src="UpFile/2008-5/3/200853191926454.gif" border=0>文件夹二</a></div>
<div id="KB2Child" class="child"><a href="sample.htm" target="_blank" ><img

src="UpFile/2008-5/3/200853191926914.gif" border=0 alt="" width="15" height="11"><img src="UpFile/2008-5/3/200853191926406.gif" border=0>页面一</a><br>
<a href="sample.htm" target="_blank" ><img src="UpFile/2008-5/3/200853191926914.gif" border=0 alt=""><img

src="UpFile/2008-5/3/200853191926406.gif" border=0>页面二</a><br>
<a href="sample.htm" target="_blank" ><img src="UpFile/2008-5/3/200853191926914.gif" border=0 alt="" width="15"

height="11"><img src="UpFile/2008-5/3/200853191926406.gif" border=0>页面三</a></div>
<div id="KB3Parent" class="parent"><a href="#" ><img

src="UpFile/2008-5/3/200853191926454.gif" border=0>文件夹三</a></div>
<div id="KB3Child" class="child"> <a href="sample.htm" target="_blank" ><img

src="UpFile/2008-5/3/200853191926914.gif" border=0 alt=""><img src="UpFile/2008-5/3/200853191926406.gif" border=0>页面一</a><br>
<a href="sample.htm" target="_blank" ><img src="UpFile/2008-5/3/200853191926406.gif" border=0>页面二</a><br>
<a href="sample.htm" target="_blank" ><img src="UpFile/2008-5/3/200853191926914.gif" border=0 alt=""><img

src="UpFile/2008-5/3/200853191926406.gif" border=0>页面三</a></div>
<script language="JavaScript">
if (NS4) {
firstEl = "KB1Parent";
firstInd = getIndex(firstEl);
arrange();
}
</script>
带选择框的JS树控件 页面创建一个HTMLElement是很耗时的,无论使用createElement或者是是innerHTML都一样。 而且这一步只能一个节点一个节点慢慢地生成,虽然可以通过减小单个节点的HTML元素量的方法提高一些速度,但是对于对于上千个节点来说仍然需要等上几十秒。 (1个节点如果有5个HTMLElement,生成1000个节点大概3秒左右) 所以只有通过异步展示的方法来进一步减少一次生成的节点数。 页面加载时并不立即生成所有节点的HTML元素,而是用户展开多少节点就生成多少节点,节点的生成发生在用户展开这个节点的时候。 这样减少了每次生成的节点数,消除了使用者的等待时间。 而对于节点的检索,这和数据的组织方式有关。 一般的组织方式是使用数组。(解析XML的话太慢,不考虑。只考虑使用json的情况) 但是在数组中检索一个节点的效率实在不敢恭维,如果节点是N个,那么全部节点数据组装起来的效率就是N*N 在节点少的时候不明显,但是如果有1000个节点,那么明显会发觉延迟了10多秒。延迟速度按指数增加。 MzTree(梅花雪)使用了另外一种方式,他没有使用数组而是使用一个简单对象来存放数组。 并且用一个字符串存放节点的索引关系(将所有的节点名(即类的属性名)join()成一个大字符串) 当需要获得子节点的时候使用正则匹配一步获得子节点ID,从而获得子节点。 经过测试发现,使用正则匹配的算法检索节点效率比使用for循环要高出很多。 这个效率已经满足一般大数据jstree的需要。 (具体算法,去参考MzTree梅花雪)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值