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"> < ...
随机推荐
- sort--Linux下文本处理五大神器之三
转自:http://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.html sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参 ...
- Python 2.7_爬取CSDN单页面利用正则提取博客文章及url_20170114
年前有点忙,没来的及更博,最近看爬虫正则的部分 巩固下 1.爬取的单页面:http://blog.csdn.net/column/details/why-bug.html 2.过程 解析url获得网站 ...
- C++对C语言的拓展(4)—— 函数重载
函数重载(Function Overload):用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同. 1.重载规则 (1)函数名相同: (2)参数个数不同,参数的类型不同,参数顺序 ...
- HIVE-利用ow_number() OVER(PARTITION BY)函数介绍求TOP-K
http://blog.csdn.net/631799/article/details/7419797 第一句话: select row_number() over (partition by mon ...
- h5 离线缓存小demo
传统的web应用是在线应用,这其实也是web的特色,对于PC时代问题并不大,但到了移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得更低.比如:在火车上,穿山越岭进隧道,便无法访问w ...
- spark gateway引发:跟踪Cloudera安装服务异常日志跟踪
spark gateway是用于接收cloudera管理的应用:可以上报数据,不影响正常使用.启动gateway失败,我觉得可能是因为配置问题? 这个问题可能比较深,因为我通过查看日志(clouder ...
- python面向对象-我的理解
参考:博客 Vamei .廖雪峰 面向对象概念 面向对象完全可以按照自然界生物分类法来理解. 当然,它不会有自然界那么复杂. 因为我专业的关系,因此个人觉得微生物来举例很容易理解. 所有的微生物都具有 ...
- thrift rpc 使用常见问题解答和经验
Thrift是一个非常棒的工具,是Facebook的开源项目,目前的开发非常的活跃,由Apache管理,所以用的是Apache Software License,这非常重要,因为可以放心的对其修改并用 ...
- Angular学习笔记-问题列表(2016.4.7)
1.控制器中注入服务时,出问题,当前pageInit这个页面无法加载,页面无报错信息. var homepage = angular.module('homepage'); homepage.cont ...
- C Primer Plus学习笔记(二)- 数据和C
从一个简单的程序开始 #include <stdio.h> int main(void) { float weight; float value; printf("Please ...