/*
自动将一个普通的html列表改为折叠的树状目录
Version 1.2
last modified 2001/2/25
by starfish
starifh.h@china.com
注意:此代码只适用于ie!在ie 5.0下测试通过,虽然没有在ie 4.0下测试,但是在ie 4.0也应该可以使用
使用说明:
1。建立一个id为"tree"的div,在其内部按照目录树的层次结构建立一个普通的html列表(注意不能是数字列表,即必须用UL和LI标记),
2。按照标准HTML语法,每个LI标记内最多只能有一个UL标记;
3。每个LI标记内可以添加别的html元素;
4。在网页的
...之间加上 ,
其中tree.js为本文件的名称,必要时加上相对路径;
5。如果需要指定目录和树叶的图片,在第四步加上的
之后(注意一定要加在tree.js后面,次序不能颠倒)加上
其中dc.gif是叶节点的图片,bs.gif是目录关闭时的图片,bo.gif是目录打开时的图片
indent=20指定下一级的目录项相对上一级的缩进量为20px;
如果不加这几句,默认没有图片,而默认缩进为20px;
6。如果某些列表项需要指定图片,可以在第2步时建立html列表时指定,例如如果列表中有一项为:
some item 则该列表项将会使用custom.gif作图片,
如果该列表项不是叶结点,而是目录节点,则可以为其指定目录打开时的图片open_img和目录关闭时的图片close_img
例如:
custom item 1
没有指定图片的节点将使用默认的图片, branch_close_img(目录关闭时的图片),
branch_open_img(目录打开时的图片)和leaf_img(叶节点图片)。
7。在网页的body标记内加上 onload="init()" ,例如:
8。当前选中的节点的类为selected,其他未选中的节点类为selected,可以通过lastSelected访问当前选中的节点;
可以利用CSS自定义选中的节点和未选中的节点的外观;
9。函数说明:
init();
初始化,必须加在body的onload事件中;
locate(s)
根据URL s定位,s必须是绝对地址;如果在某个节点中找到指向s的
链接(的形式),则返回该节点,但是不做任何事,如果要选中该节点,必须调用LocateNode(locate(s));
LocateNode(r)
根据节点r(一个LI元素)在树中定位,并将包含r的目录打开,r如果是一个目录则将r的目录打开
openAll()
将所有的目录打开
closeAll()
将所有的目录关闭
lastSelected 指向当前选择的LI元素,可以通过它来访问树中下一个节点
select(e) 选择节点e,e 必须是一个LI元素,如果e 是目录则将它的目录打开;
GetLink(e) e是一个LI元素,返回e里面的第一个A元素
nextNode(e) 找到节点e在树中的下一个相邻节点,e 必须是LI元素
prevNode(e) 找到节点e在树中的上一个相邻节点,e 必须是LI元素
*/
var leaf_img=""; //叶节点图片
var branch_close_img=""; //分支关闭时的图片
var branch_open_img=""; //分支打开时的图片
var indent=20; //左边缩进,默认值20px
var lastSelected=null; //指向当前选择的LI元素,可以通过它来访问树中下一个节点
//============================ 以下是初始化部分 ==================================
function init() //初始化
{ if (document.all.tree==null) return;
var coll = document.all.tree.children.tags("UL");
var s="";
if (coll!=null)
for (var i=0;i"+initUL(coll[i])+"";
}
document.all.tree.innerHTML=s; //画出目录树
}
function initUL(r) //初始化UL tag,返回修改后的r的innerHTML
{
var sn="";
var cli=r.children.tags("LI");
if (cli!=null)
for (var i=0;i0) //如果r有子表
{ p=si.indexOf(""); //找到子表的起始位置p
leaf=false; //r不是树叶
for (var i=0;i"+initUL(cul[i])+"
";
}
var oimg=(r.open_img!=null)? r.open_img:branch_open_img;
var cimg=(r.close_img!=null)? r.close_img:branch_close_img;
var limg=(r.leaf_img!=null)? r.leaf_img:leaf_img;
var imgstr="";
if (leaf) imgstr="
";
else imgstr="
";
sn=""+
""+
imgstr+
" "+
si.substring(0,p)+
""+
""+
sn+
"";
return sn;
}
//============================ 以上是初始化部分 ==================================
//====================== 以下函数响应鼠标单击事件 =================================
function doclick(r) //响应鼠标单击事件,r是一个span元素
{
if (r.parentElement.className=="branch") //如果选择的是树枝(r的parentElement是一个LI元素)
{
//alert(r.status);
if (r.status=="closed") r.status="opened"; else r.status="closed"; //改变节点r的状态标记
// alert(r.status);
var cul=r.parentElement.children.tags("UL");
if (cul!=null)
for (var i=0;i0)
for (var i=0;i0)
for (var i=0;i0)
for (var i=0;i0)
for (var i=0;i0)
for (var j=0;j0) //如果r是目录
{
r.children[0].status="closed";
var mm=r.children[0].children[0];
mm.src=mm.close_img; //切换目录图片
for (var i=0;i0)
for (var j=0;j0) //如果r是目录
{
r.children[0].status="opened";
var mm=r.children[0].children[0];
mm.src=mm.open_img; //切换目录图片
for (var i=0;i0) //如果e有儿子
{
var t=cul[0].children.tags("LI");
if (t!=null&&t.length>0)
return(t[0]); //返回e 的第一个儿子;
}
var par,i,son;
while (true)
{
par=e.parentElement; //par是e的父亲元素,应该是一个UL元素
if (par==null||par.tagName!="UL") return(null);//如果e没有父亲,则失败返回
son=par.children.tags("LI");
if (son!=null&&son.length>0)
for (i=0;i0)
for (i=0;i0) return(son[i-1]);//e不是他的父亲的第一个儿子,返回e的父亲的上一个儿子
par=par.parentElement;
// while (par!=null&&par.tagName!="BODY"&&par.tagName!="LI") par=par.parentElement;
if (par!=null&&par.tagName=="LI") return(par);
else return(null);
}