起因:当前的树都是在一棵树上,应产品需求,现在需要将一级菜单并列开,然后往下铺,这样只好自己写了。

demo图:

我直接封在了jquery上,此外还加了获取勾选数据的一些简单API。

思路:先把一级菜单摘出来,然后批量渲染每一列数据。

核心代码:

1.递归算法

画树必须有递归,回顾一下递归三要素:{a:递归结束条件,b:递归结束后的操作,c:提取公共逻辑}

 fn.recursive = function(data){
var that = this;
var beginStr = '<ul>', oneDataStr = '';
if(data.children.length > 0){
$.each(data.children,function(index,value){
beginStr += '<li id='+value.id+'>';
beginStr += '<input type="hidden" name="data" value='+JSON.stringify(value)+'>';
beginStr += '<input type="checkbox" name="checkOne"/>';
beginStr += '<span>'+value.name+'</span>'
beginStr += that.recursive(value);
beginStr += '</li>';
})
}
return beginStr += '</ul>';
}

通过递归来拼每一列的dom

2.勾选的交互逻辑

a:只要孩子节点选中,他所有的长辈都必须选中,(此处又有递归)

 fn.setParentIsCheck = function(_this){
if(_this.length == 0){
return false
}
var targetNode = _this.parent('li').parent('ul').siblings('input[name="checkOne"]');
if(_this.prop('checked')){
targetNode.prop('checked',true);
}else if(_this.parent('li').siblings('li').find('input[name="checkOne"]').prop('checked') == false){
targetNode.prop('checked',false);
}
this.setParentIsCheck(targetNode);
}

b:节点选中,所有孩子节点全选中。(此处需要循环遍历)

$('#' + this.treeId).delegate('input[name="checkOne"]','click',function(){
var _this = $(this);
if(_this.prop('checked')){
_this.parent('li').find('input[name="checkOne"]').each(function(index){
$(this).prop('checked',true);
})
_this.children('input[name="checkOne"]').prop('checked',true);
}else{
_this.parent('li').find('input[name="checkOne"]').each(function(index){
$(this).prop('checked',false);
})
}
that.setParentIsCheck(_this);
})

c:注意,取消勾选 当前节点,如果兄弟节点还是选中的话,他们的长辈还是选中状态(易出的bug)

3.使用

html部分:<div id="myTree" class="tree"></div>

js部分: var myTree = $('#myTree').dafeiTree(options)

源码地址

jquery封装多棵并列树的更多相关文章

  1. ajx技术解析以及模拟jQuery封装

    1.后台处理程序 <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  2. jquery封装常用方法

    var git = { //true表示格式正确 checkEmail: function (str) { -]{,})(\S*)/g) == null) { return false; } else ...

  3. 不借助jquery封装好的ajax,你能用js手写ajax框架吗

    不借助jquery封装好的ajax,你能手写ajax框架吗?最基础的ajax框架,一起来围观吧. .创建XMLHttpRequest对象 var xhr = new XMLHttpRequest(); ...

  4. jquery封装的选项卡

    ul,li,div{ margin:; padding:;} ul,li{ list-style:none;} .tab_wrap{ width:450px; margin: auto 50px; o ...

  5. 自己使用Jquery封装各种功能分享

    自己使用Jquery封装各种功能分享: 左右滚动图片 瀑布流 流动显示列表 广告切换 头像切换And广告切换 获取搜索引擎的来源关键字 上面列表中展示的功能都是使用jquery进行封装实现的,希望大家 ...

  6. 基于jQuery封装的分页组件

    前言: 由于项目需要实现分页效果,上jQuery插件库找了下,但是木有找到自己想要的效果,于是自己封装了个分页组件. 思路: 主要是初始化时基于原型建立的分页模板然后绑定动态事件并实现刷新DOM的分页 ...

  7. InnoDB一棵B+树可以存放多少行数据?

    一个问题? InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万.为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构.数据组织方式说起. 我 ...

  8. cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做

    搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...

  9. Jquery封装(学习)01

    1.在开发过程中,我们有时候会经常用到重复的jquey代码,最常见的是我们那里需要就再哪里复制粘贴,这样大大增加了冗余代码,维护起来也不方便.我们何不把共同的jquery代码封装起来,哪里需要就哪里调 ...

随机推荐

  1. selenium-查看selenium API

    pydoc是Python自带的模块,主要用于从python模块中自动生成文档,这些文档可以基于文本呈现的.也可以生成WEB 页面的,还可以在服务器上以浏览器的方式呈现! 一.pydoc 1.到底什么是 ...

  2. Python基础-列表推导式

    python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...

  3. Java企业微信开发_03_自定义菜单

    一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 这里需要格外注意的是,企业微信中请求包的数据是Json字符串格式的,而不是xml格式.关于json序列 ...

  4. Opencv - Android 配置安装

    1.道具们: windows 7 64位 OpenCV-2.4.6-android-sdk-r2 ( http://sourceforge.net/projects/opencvlibrary/fil ...

  5. STL stl_alloc.h

    # // Comment By: 凝霜 # // E-mail: mdl2009@vip.qq.com # // Blog: http://blog.csdn.net/mdl13412 # # // ...

  6. hdu 3998 Sequence

    There is a sequence X (i.e. x[1], x[2], ..., x[n]). We define increasing subsequence of X as x[i1], ...

  7. python日志轮转RotatingFileHandler在django中的一个bug

    简介 大量过时的日志会占用硬盘空间,甚至长时间运行不注意会占满硬盘导致宕机,那么就可以使用内建logging模块根据文件大小(logging.handlers.RotatingFileHandler) ...

  8. poj3414Pots(倒水BFS)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13231   Accepted: 5553   Special J ...

  9. Canal入门

    配置mysql 1.mysql开启binlog mysql默认没有开启binlog,修改mysql的my.cnf文件,添加如下配置,注意binlog-format必须为row,因为binlog如果为S ...

  10. hibernate HQL查询

    hql(都要在事务中完成)session.beginTransaction();session.getTransaction().commit(); session.beginTransaction( ...