jQuery树的实现

jQuery树

实现效果:页面分成左右两部分,左树右内容,树始终悬浮在页面固定位置,使用position:fixed实现,点击左侧树节点,右侧跳转到对应节点位置,利用a标签的锚点可以实现。

具体树的实现:我的想法是每个根节点为一个ul,然后要添加子节点则往li下面添加ul做成子节点。

效果预览:


实现源码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
<style type="text/css">
	*{margin:0;padding:0;font-family:微软雅黑;}
	.test{width:100%;height:1000px;}
	.left{width:20%;height:400px;float:left;border:1px solid #FF0000;margin-right:20px;position:fixed;}
	.left li ul{position:relative;left:20px;list-style:none;}
	.right{float:right;border:1px solid #FF0000;width:76%;}
	a{ text-decoration:none;}
	.line{height:600px;border:1px solid #3399CC;}
	.sub{height:200px;border:1px solid #FF0000;width:90%;margin-left:30px;}
</style>
<script type="text/javascript" src="../../jQuery1.7.2/jquery-1.7.2.js"></script>
</head>
<script type="text/javascript">
	jQuery(document).ready(function()
	{	
		var Class=
		{
			create:function()
			{
				return function()
				{
					this.initialize.apply(this,arguments);
				}
			}
		};
		var locationHref=Class.create();
		locationHref.prototype=
		{
			initialize:function(content,options)
			{
				this.content=$(content);
				var obj=this;
				this.treeData= 
				{
					items:[
					{"name":"中国","type":"a","href":"#a","parent":"0"},
					{"name":"韩国","type":"b","href":"#b","parent":"0"},
					{"name":"日本","type":"c","href":"#c","parent":"0"},
					{"name":"美国","type":"d","href":"#d","parent":"0"},
					{"name":"德国","type":"e","href":"#e","parent":"0"},
					{"name":"湖南","type":"f","href":"#f","parent":"a"},
					{"name":"深圳","type":"g","href":"#g","parent":"a"},
					{"name":"长沙","type":"h","href":"#h","parent":"f"},
					{"name":"岳阳","type":"i","href":"#i","parent":"f"},
					{"name":"娄底","type":"j","href":"#j","parent":"f"},
					{"name":"纽约","type":"k","href":"#k","parent":"d"},
					{"name":"华盛顿","type":"m","href":"#m","parent":"d"},
					{"name":"华尔街","type":"l","href":"#l","parent":"k"}
					]
				};
				this.rootUl=this.content.find("ul");
				this.dataInit(this.rootUl);
				//隐藏下级子菜单
				$(content+" > ul > li").find("ul").css("display","none");
				this.content.find("li").click(function()
				{
					obj.queryData($(this));
					return false;
				});
			},
			dataInit:function(currentUl) //左侧树节点初始化
			{
				for(var i=0,max=this.treeData.items.length;i<max;i++)
				{
					var data=this.treeData.items[i];
					if(parseInt(data.parent)==0) //根节点数据初始化
 					{
						var linkHref=data.href;
						currentUl.append("<li><img src='folder.gif'/><a href="+linkHref+"><span>"+data.name+"</span></a>"+
						"<input type='hidden' value="+data.type+"></li>");
					}
					else
					{
						this.addData(data);
					}
				}
			},
			setOptions:function() //参数设置
			{
			},
			deleteData:function(currentType) //删除数据,给定type值
			{
				var currentLi;
					allType=this.content.find("input");
				for(var i=0,max=allType.length;i<max;i++)
				{
					var currentInput=this.content.find("input:eq("+i+")");
					if(currentInput.val()==currentType)
					{
						currentLi=currentInput.parent("li");
						break;
					}
				}
				currentLi.empty();  //清空
				currentLi.remove(); //移除
			},
			addData:function(data) //子节点添加
			{
				var parentType=data.parent,
					parentLi;
				if(parseInt(data.parent)!=0) //表示不是根节点
				{
					for(var i=0,max=this.content.find("ul li").length;i<max;i++)
					{
						var currentLi=this.content.find("ul li:eq("+i+")");
						if(currentLi.find("input").val()==parentType)
						{
							parentLi=currentLi;
							break;
						}
					}	
				}	
				if(parentLi!=null && parentLi.find("ul").length==0)
				{
					parentLi.append("<ul></ul>");
				}
				var content="<li><img src='folder.gif'/><a href="+data.href+"><span>"+data.name+"</span>"+
							"</a><input type='hidden' value="+data.type+"></li>";
				if(parseInt(data.parent)!=0)
				{	
					parentLi.find("ul").append(content);
				}	
				else //如果是根节点
				{
					this.content.find(" > ul ").append(content);
				}
			},
			queryData:function(obj) //查询指定li下的数据
			{
				var currentUl=obj.find(" > ul");
				if(currentUl.css("display")=="none")
				{
					currentUl.stop(false,true).slideDown(200);
					obj.find(" > img").attr("src","folder-open.gif");
				}
				else
				{
					currentUl.stop(false,true).slideUp(200);
					obj.find(" > img").attr("src","folder.gif");
				}
				window.location.href=obj.find(" > a").attr("href");
			},
			queryAllData:function() //展开所有
			{
				this.content.find("li ul").stop(false,true).slideDown(200);
				this.content.find("li img").attr("src","folder-open.gif");
			},
			closeAllData:function()
			{
				this.content.find("li ul").stop(false,true).slideUp(200);
				this.content.find("li img").attr("src","folder.gif");
			}
		};
		var location=new locationHref("#left");
		var data={"name":"印度","type":"m","href":"#m","parent":"0"};
		location.addData(data);
		data={"name":"大阪","type":"n","href":"#n","parent":"c"};
		//添加子节点
		location.addData(data); //添加节点
		location.deleteData("i"); //删除节点
		$(".oper button").click(function()
		{
			var operContent=$(this).text();
			if(operContent=="展开全部")
			{	
				location.queryAllData();
				$(this).text("收起");
			}
			else
			{
				location.closeAllData();
				$(this).text("展开全部");
			}	
		});
	});
</script>
<body>
	<div class="test">
		<div class="left" id="left">
			<div class="oper"><button>展开全部</button></div>
			<ul></ul>
		</div>
		<div class="right">
			<div class="one line">
				<a href="#" name="a" >一、中国</a>
				<div class="sub line">
					<a href="#" name="f">1.1 湖南</a>
					<div class="sub line" style="height:50px; ">
						<a href="#" name="h">1.1.1 长沙</a>
					</div>
					<div class="sub line" style="height:50px; ">
						<a href="#" name="i">1.1.2 岳阳</a>
					</div>
					<div class="sub line" style="height:50px; ">
						<a href="#" name="j">1.1.3 娄底</a>
					</div>
				</div>
				<div class="sub line">
					<a href="#" name="g">1.2 深圳</a>
				</div>
			</div>
			<div class="two line">
				<a href="#" name="b" >二、韩国</a>
			</div>
			<div class="three line">
				<a href="#" name="c">三、日本</a>
			</div>
			<div class="four line">
				<a href="#" name="d">四、美国</a>
			</div>
			<div class="five line">
				<a href="#" name="e">五、德国</a>
			</div>
		</div>
	</div>
</body>
</html>




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值