阅读:5358回复: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
谢谢猫头猪兄
|
|