一、一个简单的自定义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插件的更多相关文章

  1. Node.js npm基础安装配置&创建第一个VUE项目

    使用之前,我们先来明白这几个东西是用来干什么的. node.js: 一种javascript的运行环境,能够使得javascript脱离浏览器运行.Node.js的出现,使得前后端使用同一种语言,统一 ...

  2. 从0开始写一个简单的vite hmr 插件

    从0开始写一个简单的vite hmr 插件 0. 写在前面 在构建前端项目的时候,除开基本的资源格式(图片,json)以外,还常常会需要导入一些其他格式的资源,这些资源如果没有第三方vite插件的支持 ...

  3. 一个简单的MariaDB认证插件demo

    代码地址如下:http://www.demodashi.com/demo/13076.html 一.前言 众所周知(其实可能很多人不知道)MariaDB支持插件认证.在MariaDB中新建用户,常见的 ...

  4. java:jsp: 一个简单的自定义标签 tld

    java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...

  5. js/jq基础(日常整理记录)-1-纯js格式化时间

    一.纯js格式化时间 之前记录了一些,工作中发现的比较常用的使用,就记录一下. 由于很基础,就直接贴出来了,不做分析了. 改造一下Date的原型 Date.prototype.format = fun ...

  6. js/jq基础(日常整理记录)-2-一个简单的js方法实现集合的非引用拷贝

    一.一个简单的js方法实现集合拷贝 做web项目的时候,少不了和js中的数组,集合等对象接触,那么你肯定会发现,在js中存在一个怪异的现象就是数组和集合的拷贝都是地址复制,并不是简单的数据的拷贝. 举 ...

  7. js new一个对象的过程,实现一个简单的new方法

    对于大部分前端开发者而言,new一个构造函数或类得到对应实例,是非常普遍的操作了.下面的例子中分别通过构造函数与class类实现了一个简单的创建实例的过程. // ES5构造函数 let Parent ...

  8. 土法炼钢:怎么实现一个简单的B+Tree In-Disk

    1. 写在前面 说起B+树,大家应该都很熟悉.B+树是一种平衡的多路搜索树,广泛在操作系统和数据库系统用作索引.相比于内存的存取速度,磁盘I/O存取的开销要高上几个数量级.而将B+树用作索引时,它可以 ...

  9. jquery一个简单的菜单小插件

    刚学会封装插件,先来封装一个小的菜单插件 html部分 <ul class="zong"> <li class="yiji"> < ...

随机推荐

  1. PCM音量控制

    http://blog.jianchihu.net/pcm-volume-control.html 一.声音的相关概念 声音是介质振动在听觉系统中产生的反应.声音总可以被分解为不同频率不同强度正弦波的 ...

  2. 正确安全清空在线慢查询日志slow log的流程 (转)

    1, see the slow log status; mysql> show variables like '%slow%'; +---------------------+--------- ...

  3. 一:HTML文本编译器 kindeditor-4.1.10 的使用 SpringMVC+jsp的实现

    一:我用的kindeditor版本是4.1.10 下载完成打开目录结构如下: 二:下面是工程目录也很重要,          三: 好了,准备工作已经做好了,现在就直接上代码了. 首先是页面JSP代码 ...

  4. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  5. Errors occurred during the build. Errors occurred during the build. Errors running builder 'JavaScript Validator' on XXX

    选择项目--右键Properties--Builders--如果有则取消第一项“JavaScript Validator”的勾. http://blog.csdn.net/error_case/art ...

  6. 映射块设备提示rbd: sysfs write failed的解决方法

    标签(空格分隔): ceph ceph运维 rbd 问题描述: 创建完镜像foo后,映射镜像时提示下面的错误: [root@node3 ~]# rbd map testpool/foo rbd: sy ...

  7. #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著,但并不是越多越好),加上verbose=True,显示进程使用信息

    #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著) from sklearn import datasets X, y = datasets.make_c ...

  8. XE Button Color

    XE Button Color,FMX Button 颜色 也可以放个rectangle+Glyph控件. http://blogs.embarcadero.com/sarinadupont/2014 ...

  9. 修改oracle xe的8080端口

    1.用sys管理员身份登录,利用dbms_xdb修改端口设置 SQL> -- Change the HTTP/WEBDAV port from 8080 to 8081 SQL> call ...

  10. MySQL存储引擎 -- MyISAM(表锁定) 与 InnoDB(行锁定) 锁定机制

    前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制.锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一.本章将对MySQL中两种 ...