一個棵自己寫的jQuery的樹。與大家分享一下。
主要用於動態加載子節點,避免大數據量加載頁面慢的情況。
展示效果:

下面貼上源碼:
css部分:
#TreeView
{
width:100%;
font-size:12px;
float:left;
}
.nodes /*節點*/
{
width:100%;
min-height:22px;
float:left;
}
.parentNodes /*父節點*/
{
width:100%;
height:22px;
float:left;
}
.childNodes /*子節點*/
{
float:left;
width:100%;
}
.plus /*展開和收縮圖片樣式*/
{
float:left;
cursor:pointer;
width:16px;
height:22px;
}
/* line 豎向虛線圖片
end 子節點最后拐角圖片
null 空白圖片
join 子節點相連圖片
lineh 橫向虛線圖片
load 數據加載時等待圖片
*/
.line,.end ,.null ,.join , .load
{
float:left;
width:16px;
height:22px;
}
.checkbox
{
float:left;
}
.text
{
float:left;
height:22px;
line-height:22px;
}
js部分:
//將TreeView封裝成插件的方式
(function($){
$.fn.extend({
TreeView:function(obj){
if($.type(obj)==="object"){
if(obj["Default"]!=undefined){
var objDiv=$("<div></div>");
$.each(obj["Default"],function(k,v){
var nodes=$("<div></div>").addClass("nodes");
var parentNodes=$("<div></div>").addClass("parentNodes");
var childNodes=$("<div></div>").addClass("childNodes").css("display","none");
var topplus=$("<img src=\"image/topplus.gif\"/>").addClass("plus").css({"width":"9px","height":"9px","margin":"5px 4px 8px 0"});;
var checkbox=$("<input type=\"checkbox\"/>").addClass("checkbox").css("display",obj["checkbox"]);
var a=$("<span class=\"text\"><a href=\""+v["url"]+"\">"+v["name"]+"</a></span>").addClass("text");
parentNodes.append(topplus.attr("id",v["ajaxData"])).append(checkbox).append(a);
nodes.append(parentNodes).append(childNodes);
objDiv.append(nodes);
});
$(this).append(objDiv.html());
}else{
return false;
}
//對TreeView里面所以的收縮的圖標進行監聽
$(this).delegate(".plus","click",function(){
var childNodes=$(this).parent().next(),thisObj=$(this);
if(childNodes.css("display")!="none"){
TreeFn.childHide(thisObj);
}else{
if(childNodes.html()==""){
TreeFn.GetData(thisObj,obj);
}else{
TreeFn.childShow(thisObj);
}
}
//同時對checkbox也進行監聽
}).delegate(".checkbox","click",function(){
var checkbox=$(this),childNodes=$(this).parent().next();
if(checkbox.attr("checked")){
childNodes.find(".checkbox").attr("checked",true);
}else{
childNodes.find(".checkbox").attr("checked",false);
}
})
}else{
alert("111");
}
return this;
}
});
})(jQuery);
//這里定義一個對象,把我們用的到的方法封裝以來
var TreeFn={
//將ajax動態加載好的子節點展開出來
childShow:function(thisObj){
var childNodes=thisObj.parent().next();
childNodes.show();
if(thisObj.attr("src").indexOf("top")>=0){
thisObj.attr("src","image/topminus.gif");
}else if(thisObj.attr("src").indexOf("end")>=0){
thisObj.attr("src","image/endminus.gif");
}else{
thisObj.attr("src","image/centerminus.gif");
}
},
//將子節點收縮
childHide:function(thisObj){
var childNodes=thisObj.parent().next();
childNodes.hide();
if(thisObj.attr("src").indexOf("top")>=0){
thisObj.attr("src","image/topplus.gif");
}else if(thisObj.attr("src").indexOf("end")>=0){
thisObj.attr("src","image/endplus.gif");
}else{
thisObj.attr("src","image/centerplus.gif");
}
},
//利用父節點元素的個數,構造子節點元素的個數
lineImage:function(thisobj){
var objDiv=$("<div></div>");
var p=thisobj.parent().children();
p.each(function(index){
if(index<p.size()-3){
var line=$("<img src=\"image/line.gif\"/>").addClass("line");
var nul=$("<img src=\"image/null.gif\"/>").addClass("null");
if($(this).attr("class")=="line"||$(this).attr("class")=="join"||$(this).attr("src").indexOf("center")>=0){
objDiv.append(line);
}else{
objDiv.append(nul);
}
}
});
return objDiv;
},
//解析ajax過來的json數據,將其構造成子節點
AnalyJSON:function(json,thisObj,obj){
var objDiv=$("<div></div>");
$.each(json,function(key,value){
var nodes=$("<div></div>").addClass("nodes");
var parentNodes=$("<div></div>").addClass("parentNodes");
var childNodes=$("<div></div>").addClass("childNodes").css("display","none");
var line=$("<img src=\"image/line.gif\"/>").addClass("line");
var topplus=$("<img src=\"image/topplus.gif.gif\" />").addClass("plus");
var centerplus=$("<img src=\"image/centerplus.gif\" />").addClass("plus").attr("id",value["id"]);
var endplus=$("<img src=\"image/endplus.gif\"/>").addClass("plus").attr("id",value["id"]);
var join=$("<img src=\"image/join.gif\"/>").addClass("join");
var lineh=$("<img src=\"image/lineh.gif\"/>").addClass("end");
var end=$("<img src=\"image/end.gif\"/>").addClass("end");
var checkbox=$("<input type=\"checkbox\"/>").addClass("checkbox").css("display",obj["checkbox"]);
var a=$("<span class=\"text\"><a href=\""+value["url"]+"\">"+value["name"]+"</a></span>").addClass("text");
var commone=TreeFn.lineImage(thisObj);
if(value["hasChild"]=="1"){
if(value["last"]==undefined||value["last"]!="1")
{
parentNodes.append(commone.html()).append(join).append(centerplus);
if(thisObj.next().attr("checked")){
parentNodes.append(checkbox.attr("checked",true)).append(a);
}else{
parentNodes.append(checkbox).append(a);
}
}else{
parentNodes.append(commone.html()).append(end).append(endplus);
if(thisObj.next().attr("checked")){
parentNodes.append(checkbox.attr("checked",true)).append(a);
}else{
parentNodes.append(checkbox).append(a);
}
}
nodes.append(parentNodes);
nodes.append(childNodes);
objDiv.append(nodes);
}else{
if(value["last"]==undefined||value["last"]!="1"){
parentNodes.append(commone.html()).append(join).append(lineh);
if(thisObj.next().attr("checked")){
parentNodes.append(checkbox.attr("checked",true)).append(a);
}else{
parentNodes.append(checkbox).append(a);
}
}else{
parentNodes.append(commone.html()).append(end).append(lineh);
if(thisObj.next().attr("checked")){
parentNodes.append(checkbox.attr("checked",true)).append(a);
}else{
parentNodes.append(checkbox).append(a);
}
}
nodes.append(parentNodes);
nodes.append(childNodes);
objDiv.append(nodes);
}
});
return objDiv;
},
//點擊父節點展開,進獲取下面的子節點數據
GetData:function(thisObj,obj){
$.ajax({
type:"GET",
cache:false,
async:false,
url:obj["ajaxUrl"],
dataType:"text",
data:{Key:thisObj.attr("id")},
beforeSend:function(){
thisObj.parent().append("<img src=\"image/Loading.gif\" class=\"load\"/>");
},
success:function(json){
thisObj.parent().next().html("").append(TreeFn.AnalyJSON($.parseJSON(json),thisObj,obj).html());
TreeFn.childShow(thisObj);
},
complete:function(){
thisObj.parent().children().remove(".load");
}
});
}
};
前端調用js:
$(function(){
$("#TreeView1").TreeView({
checkbox:"block", //是否顯示checkbox
ajaxUrl:"Tree.aspx", //ajax動態獲取相應父節點下面的子節點元素的地址(可以 換成需要獲取數據的url地址)
Default:[{ //TreeView首次加載時默認頂級節點名稱
name:"測試跟節點1", //名稱
url:"http://www.cnblogs.com/Suven/", //節點上的url
ajaxData:"1" //獲取下面子元素的唯一標識
},{
name:"測試跟節點2",
url:"http://www.baidu.com/",
ajaxData:"0"
}]
});
});
下面再給出服務器端返回的json數據格式:
{
"Test1":
{
"name":"測試子節點欄目1", //節點名稱
"url":"http://test1", //節點url
"id":"1", //節點id,也用於獲取下一子節點數據的id
"hasChild":"0", //是否存在子節點
"last":"1" //是否是子節點中最后一個元素,如果不是,也可不寫
},
"Test2":
{"name":"測試子節點欄目2","url":"http://test2","id":"2","hasChild":"1"},
"Test3":
{"name":"測試子節點欄目3","url":"http://test3","id":"3","hasChild":"1","last":"1"}
}
好了,到此代碼貼完。希望有需要的朋友拿去改造。有什么問題,請批評指正。
