text
;(function($) { $.extend($.fn, { treeview_addon:function(options){ var defaults = { jsonArray : null, jsonUrl:"",//通过url获取json数据,暂时未完成。 /*in the jsonArray,the key of json will become the a tag's href or the value of the input tag, and the value is also a json data made by two key-value, "text"(string,the display text of the tree's leaves) and "children"(jsonArray,the children of this branch). eg. [ { "1":{ "text":"Item1", "children": [ { "2":{ "text":"Item2", "children":[] } } ] } } ] */ inputType:false,/*you can choose checkbox,radio. if you don't want input support, you can write false*/ inputName:false, leavesTag:"span",/*just like the treeview support, you can use a or span, */ folderAHref:"",/*文件夹的链接,未完成*/ fileAhref:"",/*文件的链接,未完成*/ checkedArray:[],/*已经选择的列表,数组的元素是checkbox的value值。正在完成。。*/ partCheckedImageSrc:"./treeviewaddon/partChecked.jpg", /*properties below belong to jquery.treeview*/ control: null, animated: "fast", collapsed: true, unique: true, persist: "cookie", toggle: function() {} }; var options = $.extend(defaults,options); var $this=$(this); if(options.jsonArray!=null){ $this.html(getTreeHtml(options.jsonArray)); } $this.treeview({ animated: options.animated, persist: options.persist, collapsed: options.collapsed, unique: options.unique, toggle: options.toggle }) /*初始化已经选择的input标签*/ if(options.checkedArray.length>0){ for(var i in options.checkedArray){ $this.find("li input[value='"+options.checkedArray[i]+"']").attr("checked",true); } } if(options.inputType=="checkbox"){ var inputs=$this.find("input:"+options.inputType); inputs.click(function(e){ updateCheckBoxStates($(this)); }).each(function(index, element) { var input=inputs.eq(index); if(input.nextAll("ul").length==0){ updateCheckBoxParentsStates(input); } }); } function getTreeHtml(jsonArray){ var treeHtml=""; recurseTreeHtml(jsonArray); return treeHtml; function recurseTreeHtml(jsonArray){ for(var i =0;i"+treeItem.text+""; if(treeItem.children.length>0){ treeHtml+=" " recurseTreeHtml(treeItem.children); treeHtml+=" "; } treeHtml+="" } }; } function updateCheckBoxStates($this) { if($this.attr("checked")=="checked"||$this.attr("checked")==true) { //update lower chechbox's states $this.nextAll("ul").find("input:"+options.inputType).attr("checked",true) .css("display","inline").next("img").remove(); //update upper chechbox's states updateCheckBoxParentsStates($this); }else{ //update lower chechbox's states $this.nextAll("ul").find("input:"+options.inputType).attr("checked",false) .next("img").css("display","inline").remove(); //update upper chechbox's states updateCheckBoxParentsStates($this); } } //update the states of the upper checkbox function updateCheckBoxParentsStates($this) { var parents = findCheckBoxParents($this); for(i in parents){ var parent=parents[i]; var children=parent.nextAll("ul").find("input:"+options.inputType); var allChecked=true; var allNotChecked=true; children.each(function(ind){ if(children.eq(ind).attr("checked")=="checked"||children.eq(ind).attr("checked")==true){ allNotChecked=false; }else{ allChecked=false; } }); if(allChecked){ parent.attr("checked",true); if(parent.next().is("img")){ parent.css("display","inline").next("img").remove(); } }else if(allNotChecked){ parent.attr("checked",false); if(parent.next().is("img")){ parent.css("display","inline").next("img").remove(); } }else{ parent.attr("checked",false); if(!parent.next().is("img")){ parent.css("display","none").after("") .next("img").click(function(){ parent.click(); if(parent.attr("checked")=="checked"||parent.attr("checked")==true){ parent.css("display","inline").next("img").remove(); }else{ parent.css("display","none").after(""); } updateCheckBoxStates(parent); }); } //css("background","url(./images/partChecked.jpg)"); } } } //find the upper checkbox function findCheckBoxParents(c) { var checkBoxParents=new Array(); function pushCheckBoxParent(cc) { //alert(cc.parent().parent().html()); var checkBoxParent=cc.parent().parent().prevAll("input:"+options.inputType); if(checkBoxParent.length>0){ checkBoxParents.push(checkBoxParent); pushCheckBoxParent(checkBoxParent); } } pushCheckBoxParent(c); return checkBoxParents; } } }); })(jQuery);