由于工作需要,要直观的看到某个业务是由那些子业务引起的异常,所以我需要用树表的方式来展现各个层次的数据。

需求:

1、数据层次分明;

2、数据读取慢、需要动态加载孩子节点;

3、支持默认展开多少层。

在网上找到了很多资料,发现treeTable方面的组件质量都不高,有些还不错样式不符合,性能也比较差。想想树表也挺简单的,不就是通过隐藏或者展现某些tr来实现嘛。于是乎,自己写一个。

2011年5月4号恰好放假一个下午,于是在家里风风火火开始构造自己的树表插件。

样式我就用了http://www.hanpau.com/index.php?page=jqtreetable,包括图片以及参数命名都借鉴了。但这款插件质量不怎样,使用方式很麻烦,效率低。

一、使用接口

个人觉得,接口这部分是一款插件是否好用的核心。

jqTreeTable的用法:

html结构

  1. <span style="font-size: small;"><table id="id">
  2. <tr><td>1</td></tr>
  3. <tr><td>2</td></tr>
  4. <tr><td>3</td></tr>
  5. <tr><td>4</td></tr>
  6. </table></span>

js调用

  1. <span style="font-size: small;">var map = [0, 1, 1, 0, 4, 5];
  2. var options = {};
  3. $("#id").jqTreeTable(map, options);</span>

这个使用方式比较麻烦,后台不仅要构造html,而且还要构造出map的数组。

所以,我自己的组件改造了这种结构,如下:

html结构

  1. <span style="font-size: small;"><table id="id">
  2. <tr id="1"><td>1</td></tr>
  3. <tr id="2" pId="1"><td>2</td></tr>
  4. <tr id="3" pId="1"><td>3</td></tr>
  5. <tr id="4" pId="3"><td>4</td></tr>
  6. </table></span>

js调用

  1. <span style="font-size: small;">var options = {};
  2. $("#id").jqTreeTable(options);</span>

我这种方式只需要构造html,把父子关系当作自定义属性放在html中,使用相对方便。(注意:我刚开始是使用 key="1" pKey="2"的方式来标识一行的数据,以及行之间的关系,但想到以后通过自定义属性key来选择行效率比较低,所以改为id来存储行的唯一标识。)

二、html的格式

在jqTreeTable中:

扣红的html对应的格式是:

  1. <span style="font-size: small;"><tr>
  2. <td>6</td>
  3. <td>
  4. <img src="../images/vertline.gif" class="preimg">
  5. <img src="../images/vertline.gif" class="preimg">
  6. <img src="../images/blank.gif" class="preimg">
  7. <img src="../images/tv-collapsable.gif" class="parimg" id="treet16">Child of 4
  8. </td>
  9. <td>[0, 2, 3, 4, 6]&nbsp;</td>
  10. <td>4</td>
  11. <td>[7]</td>
  12. </tr></span>

这里有两个问题:

1、都用图片在网速慢的情况时会产生很多图片占用符...,不好看。

2、直接用图片会产生很多小图片,且不能合并。

以下是我优化的结构:

  1. <span style="font-size: small;"><tr>
  2. <td>6</td>
  3. <td>
  4. <span class="pre_span">
  5. <span class="vertline"></span>
  6. <span class="vertline"></span>
  7. <span class="blank"></span>
  8. </span>
  9. <span class="collapsable"></span>
  10. Child of 4
  11. </td>
  12. <td>[0, 2, 3, 4, 6]&nbsp;</td>
  13. <td>4</td>
  14. <td>[7]</td>
  15. </tr></span>

这样解决了上述问题:

1、在网速慢的情况时只不过看不到背景,可不会出现图片占用符。

2、使用背景偏移的方式,可以把小图片合并在同张图片中。

三、原创treeTable的实现

基本逻辑

1、展开节点的图标有分最后一个跟非最后一个,例如:展开节点时最后一个的展开和最后一个的展开。(需要isLastOne)

2、如果父节点是最后一个节点,则前缀加,如果父节点不是最后一个节点,则前缀加。(需要isLastOne、hasChild)

3、如果有孩子,则显示+或-号,如果没有则是普通的叶子节点。(需要hasChild)

4、有孩子的节点点击则展开或者隐藏相应的子节点。(需要hasChild)
5、如果存在前一个兄弟节点,则使用节点的前缀图标,若不存在则用父节点的图标。(需要isFirstOne)
 

实现过程

1、在html中,我只是把父子节点的关系写在自定义属性,但对于节点是否有孩 子(hasChild),是否是最后一个节点(isLastOne),是否是第一个节点(isFirstOne),都还不知道。所以第一步要分析出这些信 息,把这些信息都记录到自定义属性。【注意:这些信息其实也可以记录到DOM对象的自定义属性中,但DOM对象的自定义属性无法在生成html的时候初始 化,所以不采用。】

2、先扫描所有的tr,构造出两个map,分别记录{'pId' => ['id1', 'id2']}和{id => pId}的关系。

3、再次扫描所有的tr,根据两个map的关系,给tr增加hasChild、isLastOne、isFirstOne等自定义标签,并开始构造节点图标。

4、给整个table增加点击事件监控,如果是来自(hasChild)的父节点则进行点击事件。【亮点:jqTreeTable是给每个图标都绑定事件,而我是给整个table绑定一个点击事件,提高性能。】

最后效果:

5月4号那天,花了下午完成基本功能,晚上一直自主加班到1点完善功能和优化性能,包括使用span替换img,使用table整体的点击事件等。为自己的执着而加班,最后效果还比较满意。还差将图片合并成一张,再改改css,就ok了。

 

原创jquery插件treeTable v1.1

这个版本提高了性能,做了以下改进:

* 1、使用了Css Sprite Tools 合并了分散的图标

* 2、使用了.id的方式来代替原来[pId=id],这样选择孩子效率更高

* 3、把css剥离出来,增加动态添加css,每次家在前判断是否添加过

关于第二点,非常感谢onli同学的提醒。但我并没有直接修改我的接口,直接除去pId,而是在第一次遍历时将pId作为class名添加到节点中。这样有两个好处:

(1)接口可读性会比较好,pId比class更容易理解。

(2)第二点,如果直接使用class,那节点本来就有样式,这样获取到的className还要去分解空格得到pId,挺麻烦的。

原创jquery插件treeTable V1.3

这个版本扩展了事件,做了以下改进:

* 1、增加onSelect事件,onSelect: function($treeTable, id){}

* 2、增加beforeExpand事件,beforeExpand : function($treeTable, id){}

动态加载节点就靠beforeExpand 事件了。

原创jquery插件treeTable V1.4.2

这个版本修复了bug,做了以下改进:

* 1、修复了多个tableTree不在同个页面的bug,并且可以让不同的tableTree使用不同的主题。

* 2、增加了controller的自定义标签来控制可点击的区域。

  • treeTable.rar (35.1 KB)
  • 描述: treeTable V1.0
  • 下载次数: 210

原创jquery插件treeTable(转)的更多相关文章

  1. jquery插件treetable使用

    下载后treetable插件后只需要保留jquery.treetable.css样式文件,jquery.treetable.theme.default.css皮肤文件和jquery.treetable ...

  2. 原创jQuery插件之图片自适应

    效果图例如以下: 功能:使图片自适应居中位于容器内 限制:容器须要给定大小 用法: 1.引入jQuery.然后引入fitimg插件 2.给须要图片自适应的容器固定宽高 3.header .accoun ...

  3. [原创作品]手把手教你怎么写jQuery插件

    这次随笔,向大家介绍如何编写jQuery插件.啰嗦一下,很希望各位IT界的‘攻城狮’们能和大家一起分享,一起成长.点击左边我头像下边的“加入qq群”,一起分享,一起交流,当然,可以一起吹水.哈,不废话 ...

  4. 【原创】jQuery插件 - Booklet翻书特效教程(一) 一般设置

    jQuery插件 - Booklet翻书特效教程(一) 一般设置 本文由五月雨恋提供,转载请注明出处. 一.宽高(width/height) 1.自定义大小 $(function(){ // 自定义页 ...

  5. 【原创】书本翻页效果booklet jquery插件系列之简介

    booklet jquery插件系列之简介 本文由五月雨恋提供,转载请注明出处. 一.安装 1.添加CSS和Javascript 添加booklet CSS文件到你的页面. <link rel= ...

  6. jQuery插件编写及链式编程模型小结

    JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...

  7. 【最新】2015年7月之15个最新jQuery插件

    Hello,一个激动人心的好消息,现在我为大家整理最近7月发布的jQuery插件. 如果你熟悉任何下面列出的插件,请分享你的反馈与我们的读者,或如果你知道哪一个我们没有收录,那么请与我们分享在下面的评 ...

  8. FooTable高级的响应式表格jQuery插件

    FooTable是一个高级jQuery插件,允许开发者在触屏智能手机及平板电脑等小型设备上制作数据非常惊人的HTML表格.它可以将HTML表转换成可扩展的响应式表格,且通过单击某一行即可将该行数据隐藏 ...

  9. 2014年50个程序员最适用的免费JQuery插件

    有用的jQuery库是设计师和开发者之间一个非常熟悉的短语.这是现在互联网中最流行的JavaScript函数库之一.每个设计师和开发人员都应该知道它的重要性,而且熟悉它的功能和特点. jQuery几乎 ...

随机推荐

  1. jQuery中的事件处理

    1.页面载入完毕响应事件所谓页面载入完毕是指DOM元素载入就绪了,能够被读取和操作了.①jQuery中的$(doucument).ready()事件ready(fn)是jQuery事件模块中最重要的一 ...

  2. JS高程3.基本概念(2)

    1.ECMAScript数据类型 5种简单数据类型,分别是: Undefined Null Boolean Number String 1种复杂数据类型: Object (1)typeof操作符--检 ...

  3. 写pdf文件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. 你的USB设备还安全吗?USB的安全性已从根本上被打破!

    前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...

  5. 国内好用的maven仓库,添加到本地nexus中

    速度快的maven仓库真的难找,国外网站很多被封了.前天在网上找,有人说阿里有个公开的,速度很快.确实很快! 我添加到本地nexus中,结果不能更新索引,我是这么添加的,如下: 这个地址在浏览器中能够 ...

  6. 从头开始构建LINUX [LFS]

    “LINUX就是这个范”有一章专门介绍了Linux的构建,过程详细,很有意思.结合这方面的资料简要汇集一下 LFS 这个站点提供了从源代码构建一个Linux的详细步骤 书 http://archive ...

  7. 本周进步要点20161023(含李笑来第二场live笔记要点)

    本周主要忙于去武汉参加iDOF2016智能数字油田会议,会上做了题为“油田SOA及云平台的系统思考与实践”的报告,为了准备这篇报告,用到了一些以前学过的知识,具体内容见“参加iDOF2016会议的收获 ...

  8. html之file标签 --- 图片上传前预览 -- FileReader

    记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...

  9. Android Studio 运行出现 Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.

    转载请标明出处: http://www.cnblogs.com/why168888/p/5978381.html 本文出自:[Edwin博客园] 我引用compile 'com.squareup.re ...

  10. webapp开发调试环境--weinre配置

    用谷歌调试工具中的手机模拟器模拟手机进行webapp的开发,与真机上的效果还是有些偏差,opera手机模拟器的效果亦不佳.有时在pc上开发出来的webapp效果良好,在部分真机上就出现了偏差,这时候就 ...