tboqi
小狐狸
小狐狸
  • UID1138
  • 注册日期2004-12-20
  • 最后登录2005-06-22
  • 发帖数18
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
阅读:4990回复:5

各位dx帮我看看这段代码

楼主#
更多 发布于:2005-01-03 10:54
这个东西是不是要发到这里
我不知道为什么不能在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>
猫头猪
狐狸大王
狐狸大王
  • UID163
  • 注册日期2004-11-25
  • 最后登录2005-12-04
  • 发帖数595
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
1楼#
发布于:2005-01-03 10:54
你用了window.event这个全局量来取得当前event.这是微软IE的做法.
正确的做法是将event当作事件触发函数的参量传入.
tboqi
小狐狸
小狐狸
  • UID1138
  • 注册日期2004-12-20
  • 最后登录2005-06-22
  • 发帖数18
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
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';
   }  
}
就可以了
小鸟又成长了一点
tboqi
小狐狸
小狐狸
  • UID1138
  • 注册日期2004-12-20
  • 最后登录2005-06-22
  • 发帖数18
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
3楼#
发布于:2005-01-03 10:54
各位老大,再帮我看看,这段代码放到框架里,怎么就没用了
链接打不开,菜单也打不开
猫头猪
狐狸大王
狐狸大王
  • UID163
  • 注册日期2004-11-25
  • 最后登录2005-12-04
  • 发帖数595
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
4楼#
发布于:2005-01-03 10:54
把所有用id直接访问网页元素的地方都改成用document.getElementById访问。
比如
eval('var parentobj = pnode_'+id);

改成
eval('var parentobj = document.getElementById("pnode_'+id+'")');
tboqi
小狐狸
小狐狸
  • UID1138
  • 注册日期2004-12-20
  • 最后登录2005-06-22
  • 发帖数18
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
5楼#
发布于:2005-01-03 10:54
谢谢猫头猪兄
游客

返回顶部