|
阅读:5675回复:5
各位dx帮我看看这段代码
这个东西是不是要发到这里
我不知道为什么不能在ff中正确显示 主要是节点打不开,也有其他的问题 老大门帮忙 <html>
<head>
<title>JS + TEMPLATE 目录式菜单</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!--
a:link, a:visited{
text-decoration: none;
}
.treeUl{
list-style-type: none;
list-style-position: outside;
margin: 0px 0px 0px 17px;
padding: 0px;
}
-->
</style>
</head>
<body>
<script language="JavaScript1.3">
//目录结构,比较简单
//构造
function Tree(){
this.i = 0; //结点数
this.addNode = addNode;
this.createTree = createTree;
this.expandFold = expandFold;
this.hasChilds = hasChilds;
}
//添加结点
var g_nodes=new Array();
function addNode(id, pid, data, hre){
g_nodes[this.i] = new Array(id, pid, data, hre);
this.i++;
}
//递归生成结点//--------------------------------->此函数下的length1变量作用范围有问题
var imgHasChildDirOpen = "hasChildDirOpen.gif";
var imghasChildDirClosed = "hasChildDirClosed.gif";
var imgDirIsClosed = "dirIsClosed.gif";
var imgDirIsOpen = "dirIsOpen.gif";
var level = 0;
function createTree(pid){
level++;
//遍历数组, 增加节点
var tmp_arr = new Array();
tmp_arr = this.hasChilds(pid);
if( tmp_arr.length!=0){
var style1 = level==1 ? 'display' : 'none';
document.write('<ul id=pnode_'+pid+' style="display:'+style1+'" class=treeUl>'); //----------------------->此pid与id有重复,解决方法未定 : 解决方法:约定父ID名称
for(var t = 0 ; t < tmp_arr.length ; t++){
//判断是否为目录/文件,是否有子目录,如果为目录是否展开/收缩 ,默认为收缩
var dirIsOpen = 0; //是否展开 默认为收缩
var tmp_arr2 = this.hasChilds(tmp_arr[t][0]);
var hasChildDir = tmp_arr2.length>0 ? 1 : 0; //是否有子目录
var img1 = hasChildDir ? '<img src="'+imghasChildDirClosed+'" width=16 height=13 onClick=expandFold('+tmp_arr[t][0]+')>' : '<span style="margin-left:16"></span>';
var img2 = dirIsOpen ? '<img src="'+imgDirIsOpen+'" width=17 height=13 id=nodeImgDir_'+tmp_arr[t][0]+' isOpen=0 onClick=openFold('+tmp_arr[t][0]+')>' : '<img src="'+imgDirIsClosed+'" width=17 height=13 id=nodeImgDir_'+tmp_arr[t][0]+' isOpen=0 onClick=openFold('+tmp_arr[t][0]+')>' ;
var span1 ="<span id=node_"+tmp_arr[t][0]+" onClick=openFold("+tmp_arr[t][0]+")><a href='"+tmp_arr[t][3]+"' target="+"main"+">"+tmp_arr[t][2]+"</a></span>";
document.write("<li>"+img1+img2+span1+"</li>");
this.createTree(tmp_arr[t][0]);//----------------------------------->DEBUG 2, 递归 可以注释掉看运行结果
}
document.write('</ul>');
}else{
return;
}
}
//打开目录 cookie记录打开的目录
function expandFold(id){
eval('var parentobj = pnode_'+id);
var thisobj = event.srcElement;
if(parentobj.style.display == 'none'){
thisobj.src = imgHasChildDirOpen;
parentobj.style.display = 'block';
}else{
thisobj.src = imghasChildDirClosed;
parentobj.style.display = 'none';
}
}
function openFold(id){
eval('var imgId = nodeImgDir_'+id);
var isOpen1 = imgId.getAttribute('isOpen');
if(isOpen1==1){
imgId.src = imgDirIsClosed;
imgId.setAttribute('isOpen',0);
}else{
//关闭其他所有目录
for(var i=0;i<g_nodes.length;i++){
eval('var imgId2 = nodeImgDir_'+g_nodes[i][0]);
imgId2.src=imgDirIsClosed;
imgId2.setAttribute('isOpen',0);
}
imgId.src = imgDirIsOpen;
imgId.setAttribute('isOpen',1);
}
//thisobj.src = ((thisobj.src == imgDirIsClosed) ? imgDirIsOpen : imgDirIsClosed);
}
//private 查找子树
function hasChilds(pid){
var tmp_arr2 = new Array();
var i_tmp = 0;
for(t = 0 ; t < this.i ; t++){
if(g_nodes[t][1] === pid){
tmp_arr2[i_tmp] = new Array();
tmp_arr2[i_tmp++] = g_nodes[t];
}
}
return tmp_arr2;
}
//使用实例
tree = new Tree();
// 参数为 id parentid data href
tree.addNode(1, 0, '系统配置', 'xtpz.php');
tree.addNode(2, 1, '管理用户登陆', 'admin_login.php?urlfrom=hello.php');
tree.addNode(3, 1, '退出当前系统', 'logout.php');
tree.addNode(4, 1, '代码分类管理', 'cata_list.php');
tree.addNode(5, 1, '代码数据管理', 'code_list.php');
tree.addNode(6, 0, '安全管理', 'aqgl.php');
tree.addNode(7, 6, '权限设置', 'grant_list.php');
tree.addNode(8, 6, '人员设置', 'opr_list.php');
tree.addNode(9, 6, '日志查询', 'log_search.php');
tree.addNode(10,6, '修改口令', 'changepass.php');
//从数据库读取
//tree.addNode({id}, {father_id}, '{name}', '{link}');
tree.createTree(0);
</script>
</body>
</html> |
|
|
1楼#
发布于:2005-01-03 10:54
你用了window.event这个全局量来取得当前event.这是微软IE的做法.
正确的做法是将event当作事件触发函数的参量传入. |
|
|
2楼#
发布于:2005-01-03 10:54
谢谢猫头猪,
原来把这段 function expandFold(id){ eval('var parentobj = pnode_'+id); var thisobj = event.srcElement; if(parentobj.style.display == 'none'){ thisobj.src = imgHasChildDirOpen; parentobj.style.display = 'block'; }else{ thisobj.src = imghasChildDirClosed; parentobj.style.display = 'none'; } } 改为 function expandFold(id){ eval('var parentobj = pnode_'+id); //var thisobj = event.srcElement; if(parentobj.style.display == 'none'){ this.src = imgHasChildDirOpen; parentobj.style.display = 'block'; }else{ this.src = imghasChildDirClosed; parentobj.style.display = 'none'; } } 就可以了 小鸟又成长了一点 |
|
|
3楼#
发布于:2005-01-03 10:54
各位老大,再帮我看看,这段代码放到框架里,怎么就没用了
链接打不开,菜单也打不开 |
|
|
4楼#
发布于:2005-01-03 10:54
把所有用id直接访问网页元素的地方都改成用document.getElementById访问。
比如 eval('var parentobj = pnode_'+id);改成 eval('var parentobj = document.getElementById("pnode_'+id+'")'); |
|
|
5楼#
发布于:2005-01-03 10:54
谢谢猫头猪兄
|
|