Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 ADO.NET JavaScript LINQ AjaxPro DataGridView 面向对象 Extjs GridView XML DevExpress HTML教程 Oracle jQuery 分页 GDI+ Visual C++2010 MySQL Office2010 WPF MVC Dojo WCF4.0 VB.NET Sql2005 textbox cookie WCF WinForm Discuz!NT SQL经典语句 T-SQL checkbox ASPxGridView F# asp.net SQL VS2008新特性 DropDownList Access TreeView Ajax VS2008 页面执行时间 Flex 字符串 回调 VB2005 DataSet C#时间 ASP.NET性能优化 用户在线检测 动画
jQuery JavaScript Html/Css Flex Dojo ExtJSAJAX
当前位置: 主页 > Web编程 > AJAX >

打造基于jQuery的高性能TreeView

时间:2009-11-22 11:41来源:未知 作者:admin 点击:

先来看下效果图

 


 

项目中经常会遇到树形数据的展现,包括导航,选择等功能,所以树控件在大多项目中都是必须的。那一个实用的树应该具备什么功能呢?

  根据我的项目实践情况,主要是几个关键点:

  1:支持静态的树,即一次性将全部数据加载到客户端。

  2:异步树,即一次只加载一级或若干级节点,子节点可以异步加载数据。

  3:Checkbox树(可能是静态树也可能是异步树),用于选择(如选择组织机构,选择数据字典项)等,最好是能够支持节点级联(这个是难点)

  4:能够承载大数据量,并性能表现优异

  5:能够在主流浏览器中运行良好

  那我要打造的TreeView就是为了实现这个5个主要指标的。

  上图是中国行政区域的数据树,总共得节点是3500+。

  那么我们要开工了;

  1:第一个确定的节点Dom结构(即用什么样的HTML来构建节点)  

  • 比较土的是table套table的(样式上好控制,但是大数据量,和层次较深的树,这种结构肯定顶不住的)
  • 还有一种是比较新鲜的UL套LI的方式,这是现下很多书采取的方式如Jquery.treeview就是采用的这种格式,好处比较明显就是结构简洁明了,
    而且在不支持Js的浏览器上,同样也能呈现出树的形状(这种情况其实咱可以忽略),但是Jquery.treeview的节点在IE下,特别是IE6下无法被内部元素撑开,(IE7,8当达到一定深度时无法撑开),请奇怪的现象(我猜测是因为使用padding来做缩进,margin-left:负值来控制图标位置有关,但是修改起来难度也较大),在这种情况下书会变形(Jquery.treeview)就有这种问题,只能通过设置节点的width来解决。

 


JQuery.treeview的节点结构
 

Jquery.TreeView  IE6 下 展开第三级即出现错位
 

IE8下展开到第5级
还有一些是div套table的方式,CSDN的导航树就是这种,是种折中的方法(节点也不算太复杂,而且CSS也比较好写),如下图所示
 

而我采用的也是第二种方式,但是缩进采用了填空的方式,即缩进的位置用空白的图片填充来避免Jquery.treeview的问题
 

我的树节点结构

  确定了节点的HTML我们就可以来写CSS了。有了效果图,有个节点结构接着就编写CSS了

  下面是CSS的完整代码

 .ie .bbit-tree .bbit-tree-bwrap{

}
.bbit-tree ul,.bbit-tree li
{
    list-style-type
:none;
    margin
:0px;
    padding
:0px;
}
.bbit-tree-body
{
     font-size
:12px;
}
.bbit-tree-icon, .bbit-tree-ec-icon,
.bbit-tree-node-cb,.bbit-tree-elbow-line,
.bbit-tree-elbow, .bbit-tree-elbow-end,
.bbit-tree-elbow-plus, .bbit-tree-elbow-minus,
.bbit-tree-elbow-end-plus,
.bbit-tree-elbow-end-minus
{
    border
: 0 none;
    height
: 18px;
    margin
: 0;
    padding
: 0;
    vertical-align
: top;
    width
: 16px;
    background-repeat
: no-repeat;
}
.bbit-tree-node-cb
{
     height
:16px;
}
.bbit-tree-node-collapsed .bbit-tree-node-icon,
.bbit-tree-node-expanded .bbit-tree-node-icon,
.bbit-tree-node-leaf .bbit-tree-node-icon
{
    border
: 0 none;
    height
: 18px;
    margin
: 0;
    padding
: 0;
    vertical-align
: top;
    width
: 16px;
    background-position
:center;
    background-repeat
: no-repeat;
}

.ie .bbit-tree-node-indent img, .ie .bbit-tree-node-icon,
.ie .bbit-tree-ec-icon
{
    vertical-align
:middle !important;
}

.bbit-tree-noicon .bbit-tree-node-icon
{
    width
:0; height:0;
}

/* No line styles 没有线的样式 */
.bbit-tree-no-lines .bbit-tree-elbow
{
    background
:transparent;
}

.bbit-tree-no-lines .bbit-tree-elbow-end
{
    background
:transparent;
}

.bbit-tree-no-lines .bbit-tree-elbow-line
{
    background
:transparent;
}

/* Arrows Vista系统树的样式只有箭头*/
.bbit-tree-arrows .bbit-tree-elbow
{
    background
:transparent;
}

.bbit-tree-arrows .bbit-tree-elbow-plus
{
    background
:transparent no-repeat 0 0;
}

.bbit-tree-arrows .bbit-tree-elbow-minus
{
    background
:transparent no-repeat -16px 0;
}

.bbit-tree-arrows .bbit-tree-elbow-end
{
    background
:transparent;
}

.bbit-tree-arrows .bbit-tree-elbow-end-plus
{
    background
:transparent no-repeat 0 0;
}

.bbit-tree-arrows .bbit-tree-elbow-end-minus
{
    background
:transparent no-repeat -16px 0;
}

.bbit-tree-arrows .bbit-tree-elbow-line
{
    background
:transparent;
}

.bbit-tree-arrows .bbit-tree-ec-over .bbit-tree-elbow-plus
{
    background-position
:-32px 0;
}

.bbit-tree-arrows .bbit-tree-ec-over .bbit-tree-elbow-minus
{
    background-position
:-48px 0;
}

.bbit-tree-arrows .bbit-tree-ec-over .bbit-tree-elbow-end-plus
{
    background-position
:-32px 0;
}

.bbit-tree-arrows .bbit-tree-ec-over .bbit-tree-elbow-end-minus
{
    background-position
:-48px 0;
}

.bbit-tree-elbow-plus,
.bbit-tree-elbow-minus,
.bbit-tree-elbow-end-plus,
.bbit-tree-elbow-end-minus
{
    cursor
:pointer;
}

.ie ul.bbit-tree-node-ct
{
    font-size
:0;
    line-height
:0;
    zoom
:1;
}

.bbit-tree-node
{
    white-space
: nowrap;
}

.bbit-tree-node-el
{
    line-height
:18px;
    cursor
:default;
  
/* cursor:pointer;*/
}

.bbit-tree-node a
{
    text-decoration
:none;
    -khtml-user-select
:none;
    -moz-user-select
:none;
    -webkit-user-select
:ignore;
    -kthml-user-focus
:normal;
    -moz-user-focus
:normal;
    -moz-outline
: 0 none;
    outline
:0 none;
}

.bbit-tree-node a span
{
    text-decoration
:none;
    padding
:1px 3px 1px 2px;
}

.bbit-tree-node .bbit-tree-node-disabled .bbit-tree-node-icon
{
   -moz-opacity
: 0.5;
   opacity
:.5;
   filter
: alpha(opacity=50);
}

.bbit-tree-node .bbit-tree-node-inline-icon
{
    background
:transparent;
}

.bbit-tree-node a:hover
{
    text-decoration
:none;
}



/* Fix for ie rootVisible:false issue,修正一个IEdebug */
.bbit-tree-root
{
    zoom
:1;
}


/***********这里是图标了,可以在这里替换哦*****************/
.bbit-tree-node-expanded .bbit-tree-node-icon
{
    background-image
:url(images/tree/folder-open.gif);
}

.bbit-tree-node-leaf .bbit-tree-node-icon
{
    background-image
:url(images/tree/leaf.gif);
}

.bbit-tree-node-collapsed .bbit-tree-node-icon
{
    background-image
:url(images/tree/folder.gif);
}

.bbit-tree-node-loading .bbit-tree-node-icon
{
    background-image
:url(images/tree/loading.gif) !important;
}

.bbit-tree-node .bbit-tree-node-inline-icon
{
    background-image
: none;
}

.bbit-tree-node-loading a span
{
     font-style
: italic;
     color
:#444444;
}

.bbit-tree-lines .bbit-tree-elbow
{
    background-image
:url(images/tree/elbow.gif);
}

.bbit-tree-lines .bbit-tree-elbow-plus
{
    background-image
:url(images/tree/elbow-plus.gif);
}

.bbit-tree-lines .bbit-tree-elbow-minus
{
    background-image
:url(images/tree/elbow-minus.gif);
}

.bbit-tree-lines .bbit-tree-elbow-end
{
    background-image
:url(images/tree/elbow-end.gif);
}

.bbit-tree-lines .bbit-tree-elbow-end-plus
{
    background-image
:url(images/tree/elbow-end-plus.gif);
}

.bbit-tree-lines .bbit-tree-elbow-end-minus
{
    background-image
:url(images/tree/elbow-end-minus.gif);
}

.bbit-tree-lines .bbit-tree-elbow-line
{
    background-image
:url(images/tree/elbow-line.gif);
}

.bbit-tree-no-lines .bbit-tree-elbow-plus
{
    background-image
:url(images/tree/elbow-plus-nl.gif);
}

.bbit-tree-no-lines .bbit-tree-elbow-minus
{
    background-image
:url(images/tree/elbow-minus-nl.gif);
}

.bbit-tree-no-lines .bbit-tree-elbow-end-plus
{
    background-image
:url(images/tree/elbow-end-plus-nl.gif);
}

.bbit-tree-no-lines .bbit-tree-elbow-end-minus
{
    background-image
:url(images/tree/elbow-end-minus-nl.gif);
}

.bbit-tree-arrows .bbit-tree-elbow-plus
{
    background-image
:url(images/tree/arrows.gif);
}

.bbit-tree-arrows .bbit-tree-elbow-minus
{
    background-image
:url(images/tree/arrows.gif);
}

.bbit-tree-arrows .bbit-tree-elbow-end-plus
{
    background-image
:url(images/tree/arrows.gif);
}

.bbit-tree-arrows .bbit-tree-elbow-end-minus
{
    background-image
:url(images/tree/arrows.gif);
}

/*TreeNode 选中的Disabled的一些颜色,字体样式*/
.bbit-tree-node
{
    color
:#000;
    font
: normal 11px arial, tahoma, helvetica, sans-serif;
}

.bbit-tree-node a
{
    color
:#000;
}
.bbit-tree-node a span
{
    color
:#000;
}
.bbit-tree-node .bbit-tree-node-disabled a span
{
    color
:gray !important;
}
.bbit-tree-node .bbit-tree-node-over
{
    background-color
: #eee;
}

.bbit-tree-node .bbit-tree-selected
{
    background-color
: #d9e8fb;
}

 

上面了树的基本样式外,定义了一个有+号带line的样式和+号不带line的样式

 


这就是那个+号带line的样式

  css中所用到的所有图片

 

2:确定数据结构

  这样的结构有个好处就数据本身是带层次的,非常利于遍历,在后面的级联关联中会看到

var menudata = [{
    id:
"0.1",//唯一的ID即可
    text: "Beyondbit UI Demo",
    hasChildren:
true,
    isexpand:
true,
    complete:
true,
ChildNodes: [{
        id:
"0.1.1",
        text:
"日期选择",
        hasChildren:
true,
        isexpand:
false,
        complete:
true,
ChildNodes: [{
            id:
"0.1.1.1",
            text:
"控件演示",
            value:
"Testpages/datepickerDemo.htm",
            hasChildren:
false,
            isexpand:
false,
            complete:
true,
            ChildNodes:
null
        },
        ]

(责任编辑:admin)

Tags:
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价
  • JQuery RadioButtonList

    首先介绍程序规则: 1.对以下的选择进行检查,检查是否全部选中 2,所谓的全部选中是指,一行中三个radiobutton必须有一个radiobutton被选中。...

  • JQuery实现智能输入提示(仿机票预订网站)

    最近在研究JQuery框架,JQuery是一套很优秀的JS框架,可以实现很多美观实用的控件。今天给大家推荐一个智能提示的空间,是模仿现在很多机票预订网站的城市智...

  • jQuery得到ashx返回的JSON格式的DataSet的方法

    jQuery得到ashx返回的JSON格式的DataSet的方法...

  • JQuery点击行(tr)实现checkBox选中,反选时移除和添加样式

    用到了三元运算符,和一个自定义的函数。 点击行时效果代码: $( tr ).live( click , function (){ if ($( this ).h...

  • 用jQuery模仿新浪微博时间组件

    废话不多说,实现原理主要是处理table,生成tr td,其中最重要的是如何找出每月第一天是星期几,然后就能对应出这个月的余下天数. 首先,说下有些人说这是重复...

  • Jquery之Ajax运用_学习运用篇

    JQuery中Ajax的运用相信很多人都已熟悉,本文主要是记录下个人实践中的应用知识,旨在加强记忆。 还是先说一些 基础知识: 语法:$.ajax({optio...

  • JQuery单选按钮和多选按钮状态判断

    function check_required() { var valid = true; var required=new Array; $(.require...

  • jQuery AJAX的小应用——手机号码归属地查询

    jQuery AJAX的小应用手机号码归属地查询 想测试下jQuery调用个第三方的WebService,利用 jQuery 的 $.get(url, data...

  • 多标签折页(jQuery示例)

    现在的垃圾留言越来越智能,并且从留言内容几乎看不出来是垃圾留言,而大量的垃圾留言会导致文章可读性下降,并可能会被搜索引擎惩罚,经过一段时间的分析和思考,我发现一...

  • JQuery 文本框高亮显示插件

    JQuery 中没有这个方法,自己今天写了一个Plugin,把代码贴出来分享一下; 代码如下: jquery-highlight.js /* descripti...

  • jquery的select插件

    Jquery是可以操作select表单控件的,比较反锁,下面是收集来的一个插件,还不错,能满足基本的选择。 可以使用这样的引入: type=text/javas...

  • 使用Jquery完成图片的预加载

    // 定义预加载图片列表的函数(有参数) jQuery.preloadImages = function (){ // 遍历图片 for ( var i = 0...

  • jQuery在asp.net中实现图片自动滚动

    时间真快,不知不觉12月已经过了一半了,新的一年即将到来。有段时间没写东西了,技术这东东天天都在更新,天天都是一个新面孔,如果不坚持学习肯定就会落在队尾。要想跟...

  • JQuery遍历表格指定列

    script type=text/javas cript $(function(){ $(#tb tr:gt(0)).each(function(){ var ...

  • AJAX无刷新下拉框联动

    AJAX无刷新下拉框联动的简单示例,分别使用了AJAX组件和xmlHttp异步刷新两种方式。 前台代码: %...@ Page Language=C# Auto...