js/jq基础(日常整理记录)-4-一个简单的自定义tree插件
一、一个简单的自定义tree插件
上一篇是之前自定义的table插件,这一篇也是之前同期尝试做的一个tree插件。
话不多说,先看看长什么样子哈!

现在来看确实不好看,以后在优化吧!
数据源:ajax请求的挡板数据
[
{"id":"1","name":"安徽","url":"www.baidu.com","pid":"0"},
{"id":"2","name":"江苏","url":"","pid":"0"},
{"id":"3","name":"合肥","url":"","pid":"1"},
{"id":"4","name":"庐阳区","url":"","pid":"3"},
{"id":"5","name":"大杨镇","url":"","pid":"4"},
{"id":"6","name":"南京","url":"","pid":"2"},
{"id":"7","name":"玄武区","url":"","pid":"6"},
{"id":"8","name":"梅园新村街道","url":"","pid":"7"},
{"id":"9","name":"上海","url":"","pid":"0"},
{"id":"10","name":"黄浦区","url":"","pid":"9"},
{"id":"11","name":"外滩","url":"","pid":"10"},
{"id":"12","name":"安庆","url":"","pid":"1"},
{"id":"13","name":"阜阳","url":"","pid":"1"},
{"id":"14","name":"湖南","url":"","pid":"0"}
]
js插件源码:还不完善,以后优化
/**
* JS自执行函数
* @param {Object} $
* @param {Object} undefined
*/
;(function($,undefined){ /**
* 设置tree默认属性
*/
var MyTree=function(ele,opt){
_defaults={
id:'',
data:null,
url:null,
params:null
}
//装配设置
this.Property=$.extend({},_defaults,opt);
}
/**
* 公共资源
*/
var imgPublicDefault='<img class="lj-ul-li-img" src="./img/trees/tree-ul3.jpg">';
var spacePulicDefault='<div class="lj-ul-li-space">-</div>';
var spacePulicDefault2='<div class="lj-ul-li-space"><img class="lj-ul-li-img" src="./img/trees/tree-split1.jpg"></div>'; /**
* 设置tree原型
*/
MyTree.prototype={
//初始化tree
init:function(){
//初始化数据
var datas=this.initData(this);
//统一注册事件
this.bindEvent(this,datas);
},
//初始化数据
initData:function($this){
var _data=$this.Property.data;
//如果有数据,则直接使用,没有则根据url去获取数据 使用优先级: data > url
if(_data!=null){
$this.createTree(_data);
}else{
$.ajax({
url:$this.Property.url,
data:$this.Property.params,
type:'get',
async:false,
dataType:'json',
success:function(responseData){
_data=responseData;
$this.createTree($this,responseData);
}
});
}
return _data;
},
//开始生成tree
createTree:function($this,datas){
var $ul=$('#'+$this.Property.id);
var $lis='';
$('<ul id="lj-tree-ul" class="lj-tree-ul-container"></ul>').appendTo($ul);
//拿到处理之后的数据
var dealedDatas=$this.sortTreeDatasFn($this,datas);
//开始生产tree结构
$.each(dealedDatas, function(index,node) {
//生成tree每个节点
$lis+=$this.creatTreeNodes($this,index,node);
});
$($lis).appendTo($('#lj-tree-ul'));
return dealedDatas;
},
//递归生产父节点以及包含的子节点
creatTreeNodes:function($tree,index,node){
var $lis='';
//只有父节点时:直接添加
if(node.childs.length==0){
$lis='<li class="lj-tree-li" id="fold_'+node.id+'">'+spacePulicDefault+'<input id="fold_radio_'+node.id+'" type="checkbox"/>'+node.name+'</li>';
}else{
//含有子节点时:递归处理
$lis='<li class="lj-tree-li" id="fold_'+node.id+'"><img id="fold_img_'+node.id+'" class="lj-ul-li-img" src="./img/trees/tree-ul3.jpg"><input id="fold_ck_'+node.id+'" type="checkbox"/>'+node.name;
$lis+=$tree.creatNodesByChilds($tree,node);
}
return $lis;
},
//递归生成带有子节点的父节点
creatNodesByChilds:function($tree,node){
//递归处理:
var $lis=$tree.forFnByChilds($tree,node,node.childs);
return $lis;
},
forFnByChilds:function($tree,parentNode,childNodes){
var $lis='<ul class="lj-tree-ul">';
$.each(childNodes, function(index,node) {
if(node.childs.length==0){
$lis+='<li class="lj-tree-li" id="fold_'+node.id+'">'+spacePulicDefault+'<input id="fold_ck_'+node.id+'" type="checkbox"/>'+node.name+'</li>';
}else{
$lis+='<li class="lj-tree-li" id="fold_'+node.id+'"><img id="fold_img_'+node.id+'" class="lj-ul-li-img" src="./img/trees/tree-ul3.jpg"><input id="fold_ck_'+node.id+'" type="checkbox"/>'+node.name;
$lis+=$tree.forFnByChilds($tree,node,node.childs);
}
});
return $lis+='</ul></li>';
},
//递归处理json数据
sortTreeDatasFn:function($this,arr){
return $this.forFn($this,arr,'0');
},
forFn:function($this,arr,id){
var temp=[];
var count=0;
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (item.pid==id) {
temp[count]=item;
temp[count].childs=$this.forFn($this,arr,item.id);
count++;
}
}
return temp;
},
//统一注册事件
bindEvent:function($this,$datas){
//折叠选择更换
$this.treeFoldChanged($datas);
//全选、全消
$this.treeSelectByNode($datas); },
//折叠按钮触发事件
treeFoldChanged:function($datas){
$.each($datas,function(index,node){
var nodeId='fold_img_'+node.id;
$('#'+nodeId).bind('click',function(){
$('#fold_'+node.id+'>ul').toggle( function(){
if($(this).css('display')=='none'){
$('#'+nodeId).attr("src","img/trees/tree-ul2.jpg");
}else{
$('#'+nodeId).attr("src","img/trees/tree-ul3.jpg");
}
});
});
});
},
//全选
treeSelectByNode:function($datas){
$.each($datas,function(index,node){
var radioId='fold_ck_'+node.id;
$('#'+radioId).bind('click',function(){
var radios=$(this).parent().find('input');
$.each(radios,function(i,node){
node.checked=radios[0].checked;
});
});
});
} } /**
* 创建tree实例
* @param {Object} options
*/
$.fn.mytree=function(options){
//实例化tree对象
var tree=new MyTree(this,options);
//初始化tree
tree.init();
//返回tree对象
return tree;
} })(jQuery);
看看如何使用:
<script type="text/javascript">
$(function() {
$('#treeData').mytree({
id:'treeData',
data:null,
url:'json/tree_learn_02.json',
params:null
});
});
</script>
js/jq基础(日常整理记录)-4-一个简单的自定义tree插件的更多相关文章
- Node.js npm基础安装配置&创建第一个VUE项目
使用之前,我们先来明白这几个东西是用来干什么的. node.js: 一种javascript的运行环境,能够使得javascript脱离浏览器运行.Node.js的出现,使得前后端使用同一种语言,统一 ...
- 从0开始写一个简单的vite hmr 插件
从0开始写一个简单的vite hmr 插件 0. 写在前面 在构建前端项目的时候,除开基本的资源格式(图片,json)以外,还常常会需要导入一些其他格式的资源,这些资源如果没有第三方vite插件的支持 ...
- 一个简单的MariaDB认证插件demo
代码地址如下:http://www.demodashi.com/demo/13076.html 一.前言 众所周知(其实可能很多人不知道)MariaDB支持插件认证.在MariaDB中新建用户,常见的 ...
- java:jsp: 一个简单的自定义标签 tld
java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...
- js/jq基础(日常整理记录)-1-纯js格式化时间
一.纯js格式化时间 之前记录了一些,工作中发现的比较常用的使用,就记录一下. 由于很基础,就直接贴出来了,不做分析了. 改造一下Date的原型 Date.prototype.format = fun ...
- js/jq基础(日常整理记录)-2-一个简单的js方法实现集合的非引用拷贝
一.一个简单的js方法实现集合拷贝 做web项目的时候,少不了和js中的数组,集合等对象接触,那么你肯定会发现,在js中存在一个怪异的现象就是数组和集合的拷贝都是地址复制,并不是简单的数据的拷贝. 举 ...
- js new一个对象的过程,实现一个简单的new方法
对于大部分前端开发者而言,new一个构造函数或类得到对应实例,是非常普遍的操作了.下面的例子中分别通过构造函数与class类实现了一个简单的创建实例的过程. // ES5构造函数 let Parent ...
- 土法炼钢:怎么实现一个简单的B+Tree In-Disk
1. 写在前面 说起B+树,大家应该都很熟悉.B+树是一种平衡的多路搜索树,广泛在操作系统和数据库系统用作索引.相比于内存的存取速度,磁盘I/O存取的开销要高上几个数量级.而将B+树用作索引时,它可以 ...
- jquery一个简单的菜单小插件
刚学会封装插件,先来封装一个小的菜单插件 html部分 <ul class="zong"> <li class="yiji"> < ...
随机推荐
- poj2010
大学招n(n为奇数)个牛 招第i个牛需要ai块钱 第i个牛高考si分 输入招的牛数n 总的牛数c 总的钱数f 以及ai si 问用这些钱招的n个牛高考分数的中位数最大是多少 如果钱不够输出-1 这题结 ...
- [Luogu4177][CEOI2008]order
luogu sol 这题有点像网络流24题里面的太空飞行计划啊. 最大收益=总收益-最小损失. 先令\(ans=\sum\)任务收益. 源点向每个任务连容量为收益的边. 每个机器向汇点连容量为购买费用 ...
- Oracle中OEM的启动与关闭
我已经选择安装了,但安装后发现开始菜单里并没有OEM,在哪里可以打开呢? 从Oracle10g开始,Oracle极大的增强了OEM工具,并通过服务器端进行EM工具全面展现.在10g中,客户端可以不必安 ...
- bzoj 2839 集合计数 —— 二项式反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839 设 \( f(i) \) 为至少 \( i \) 个选择,则 \( f(i) = C_ ...
- ps命令,性能监控,grep命令
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- 转载:MongoDB 在 58 同城百亿量级数据下的应用实践
为什么要使用 MongoDB? MongoDB 这个来源英文单词“humongous”,homongous 这个单词的意思是“巨大的”.“奇大无比的”,从 MongoDB 单词本身可以看出它的目标是提 ...
- 2018年长沙理工大学第十三届程序设计竞赛 H数学考试
链接:https://www.nowcoder.com/acm/contest/96/H来源:牛客网 数学考试 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 调试json
console.log("======================") // 转对象 //var obj = eval('(' + data + ')'); // 转对象 // ...
- 2015.1.31 DataGridView自动滚动到某行
方法一.dv.CurrentCell = dv.Rows[i].Cells[2] 但此cell不能是隐藏cell 方法二. if (dgr.Index < dv_sel_aw.FirstDisp ...
- php字符型转整型
$arr = array(0=>1,"aa"=>2, 3, 4); foreach($arr as $key=>$val){ print($key == &quo ...