`

extjs 的tree解析

阅读更多
在应用程序中,我们经常需要显示或处理树状结构的对象信息,比如部门信息和地区信息,树是一种非常典型的数据结构,这些信息都可以用树来表示。对于传统的 HTML页面来说,完全依靠手动编码来实现树是比较困难的,因为需要写很多的JS代码,对基于AJAX异步加载来说尤其如此,不但涉及AJAX数据异步加载,还需要考虑跨浏览器支持,处理起来非常麻烦,EXT中提供了现成的树控件,通过这些控件,可以在B/S应用中快速开发出包含树形信息结构的应用。

本文就是详细介绍树形结构的使用过程和实例。

一、创建一棵树
树控件由Ext.tree.TreePanel类定义,控件的名称为TreePanel,TreePanel类继承自Panel面板,在EXT中使用树控件非常简单,我们先来看一下代码(包含配置信息)。

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>简单的树形</title>
    <link rel="stylesheet" type="text/css" href="../resources/css/ext-all.css"/>
    <script type="text/javascript" src="../adapter/ext/ext-base.js"</script>
    <script type="text/javascript" src="../ext-all.js"></script>
    <script type="text/javascript"><!--
        Ext.onReady(function(){
            var tree=new Ext.tree.TreePanel({
                el:'tree'
            });
            var root=new Ext.tree.TreeNode({text:'我是根'});
            tree.setRootNode(root);
            tree.render();           
        });   
</script>
</head>
<body>
<div id="tree"></div>
</body>
</html>

这里的参数tree表示渲染的DOM的id.HTML中应该要要有<div id="tree"></div>相对应,最后这棵树就出现在这个div的位置上。

在获得了树形面板后,就必须要设置根,因为必须有了根才可以生长枝节,最后生成完整的树,所以根是必须的。具体实现的效果如图1所示。

1

图1 只有根的树

二、为树生枝展叶
上面的实例代码生成一棵没有根的树,下面的代码就为树添加枝和叶,代码清单如下:

<script type="text/javascript">
        Ext.onReady(function(){
            var tree=new Ext.tree.TreePanel({
                el:'tree',
                autoHeight:true
            });
            var root=new Ext.tree.TreeNode({text:'区域信息'});           
            var node1=new Ext.tree.TreeNode({text:'湖南省'});
            var node3=new Ext.tree.TreeNode({text:'广东省'});
            var node2=new Ext.tree.TreeNode({text:'广州市'}); 
                   
            node3.appendChild(node2);
            root.appendChild(node1);
            root.appendChild(node3);
            tree.setRootNode(root); 
                     
            tree.render();           
        });
</script>

效果图如图2所示:

2

图2 完整的树控件

注意:我们一方面可以通过修改<div id="tree" style="height:300px;"></div>来设置div高度;同时也可以设置treePanel的 autoHeight属性为tree,则可以自动计算高度,否则展开的树形控件看不到枝叶。

三、使用TreeLoader获得数据
使用上面的录入方式来获取数据不仅麻烦,而且还容易出错,Ext.tree.TreeLoader可以利用从后台获取的数据为我们组装出一棵树来,我们只需要提供数据,让treeLoader完成数据转换和装配节点的操作。

(1)我们要为TreePanel配置一个TreeLoader,如下面代码所示:

var tree=new Ext.tree.TreePanel({
                el:'tree',
                loader:new Ext.tree.TreeLoader({dataUrl:'data.txt'}),               
                autoHeight:true
            });

(2)这里的TreeLoader仅包含一个参数{dataUrl:'data.txt'},这个dataUrl表示在树完成渲染后从何处读取数据。data.txt内容如下:

[
    {text:'not leaf'},
    {text:'is leaf',leaf:true}
]

(3) 现在查看页面依然只能看到根,没有读取数据并显示到页面上,因为我们使用的TreeNode不支持Ajax,我们需要将其改成AsyncTreeNode,这样才可以实现我们想要的异步加载效果,如下面的代码所示:

var root=new Ext.tree.AsyncTreeNode({text:'区域信息'});

注意:必须将root.expand(true,true)修改成root.expand()避免无限循环展开树枝。

四、读取本地JSON数据
读取本地JSON其实是一种是用使用TreeLoader的另类方法。因为有时候树形的数据并不多,为了获取少量的数据而是用AJAX访问后台实在不划算。首先为TreePanel设置一个参数为空的TreeLoader,如下面代码所示:

var tree=new Ext.tree.TreePanel({
                el:'tree',
                loader:new Ext.tree.TreeLoader(),               
                autoHeight:true
            });

然后,设置一个根节点,并为这个根节点设置children属性,如下面代码所示:

var root=new Ext.tree.AsyncTreeNode({
                text:'我是根',
                children:[
                    {text:'Leaf No.1',leaf:true},
                    {text:'Leaf No.1',leaf:true}
                ]
            });
            tree.setRootNode(root);

这里需要注意几点:

(1) 必须设置TreeLoader,否则根节点会一直处于在读取状态,无法获得children中定义的子节点

(2) 根节点必须是AsyncTreeNode,如果是TreeNode,也无法生成子节点

(3) 子节点中的叶子节点必须都加上leaf:true,否则会一直显示读取状态。

五、右键菜单
树形弹出的右键菜单效果图如图3所示:

3

图3 右键菜单效果

具体实现步骤如下:

(1) 制作自定义菜单,如下面的代码所示:

var contextmenu=new Ext.menu.Menu({
                id:'theContextMenu',
                    items:[{
                        text:'点击',
                        handler:function(){
                            alert('我被点中了');
                        }
                    }]
            });

(2) 绑定contextmenu时间,如下面代码所示:

tree.on("contextmenu",function(node,e){
                e.preventDefault();
                node.select();
                contextmenu.showAt(e.getXY());
            });

六、修改节点的默认图标
实际上,每个树形节点都有icon和iconCls属性,他们负责制定节点的图标,现在我们来修改树种节点的图标,无论是通过new手工创建的节点,还是通过JSON读取到的节点,设置方式都是一样,如下面代码所示:

var root1=new Ext.tree.TreeNode({
                text:'icon',
                icon:'user_female.png'
            });

七、从节点弹出对话框
下面的代码可以让对话框看起来像是从标题上飞出来的:

tree.on("click",function(node){
                Ext.Msg.show({
                    title:'提示',
                    msg:"你单击了"+node,
                    animEl:node.ui.textNode
                });
            });

八、节点提示信息
当我们把鼠标停留在某个节点的上方时,便会出现提示信息,为了实现这种效果,我们需要对提供的JSON数据做一些修改,在JSON中添加对应的节点提示信息,我们给每个节点数据都加上qtip:'xxx'参数,这个节点就可以显示提示信息了。

不过,仅仅为JSON添加这个参数还不能在页面上显示提示信息,需要先在JS中对EXT的提示功能进行初始化。

Ext.QuickTips.init();//开启提示功能

上面这行代码必须在其他功能加载前完成,建议写在onReady函数的第一行。具体代码如下:

<script type="text/javascript">
        Ext.onReady(function(){
            Ext.QuickTips.init();
            var tree=new Ext.tree.TreePanel({
                el:'tree',
                loader:new Ext.tree.TreeLoader(),               
                autoHeight:true
            });
            var root=new Ext.tree.AsyncTreeNode({
                text:'我是根',
                children:[
                    {text:'Leaf No.1',qtip:'No1',leaf:true},
                    {text:'Leaf No.1',qtip:'No2',leaf:true}
                ]
            });
            var root1=new Ext.tree.TreeNode({
                text:'icon',
                icon:'user_female.png'
            });
            tree.setRootNode(root);
            //root.expand(true,true);
            var contextmenu=new Ext.menu.Menu({
                id:'theContextMenu',
                    items:[{
                        text:'点击',
                        handler:function(){
                            alert('我被点中了');
                        }
                    }]
            });
            tree.on("contextmenu",function(node,e){
                e.preventDefault();
                node.select();
                contextmenu.showAt(e.getXY());
            });
            tree.on("click",function(node){
                Ext.Msg.show({
                    title:'提示',
                    msg:"你单击了"+node,
                    animEl:node.ui.textNode
                });
            });
            tree.render();                     
                      
        });
</script>

九、为节点设置超链接
虽然我们完全可以监听click事件,但是直接在节点树形中设置超链接的地址也是一个好主意,这是很多人想实现的功能,具体的代码如下:

var root=new Ext.tree.AsyncTreeNode({
                text:'我是根',
                children:[
                    {text:'新浪网',qtip:'新浪网',leaf:true,href:'http://www.sina.com.cn'},
                    {text:'百度中国',qtip:'<a class="channel_keylink" href="http://www.pqshow.com/Special/seo/" target="_blank">搜索引擎</a>',leaf:true,href:'http://www.baidu.cn',hrefTarget:'_blank'}
                ]
            });
分享到:
评论

相关推荐

    Extjs Tree + JSON + Struts2 例子

    对于 ExtJS Tree 的数据加载器,它期望接收一个 JSON 数组,因此无法解析 Struts2 返回的对象。 为了解决这个问题,开发者转向了 json-lib,这是一个 Java 库,用于处理 JSON 数据。json-lib 可以帮助我们将 Struts...

    Extjs Tree + JSON + Struts2 示例源代码

    ExtJS Tree + JSON + Struts2 示例源代码是结合了三种技术来实现一个动态的、交互式的树形数据展示的应用。这个示例中,ExtJS用于前端UI的构建,JSON作为数据交换格式,而Struts2则作为后端MVC框架处理请求和返回...

    带复选框的 ExtJs tree

    ### 标题解析:“带复选框的ExtJS tree” 标题直接点明了文章的主题,即在ExtJS框架中实现带有复选框功能的树形结构。这种类型的树形结构在许多场景下都非常有用,比如权限管理、多级分类管理等,它允许用户选择或...

    extjs-tree.zip_extjs tree

    ExtJS Tree是一个强大的JavaScript库,专门用于创建交互式的树形结构。这个"extjs-tree.zip"文件包含了使用Java编写的ExtJS异步树形控件的示例代码,旨在帮助开发者快速理解和应用这一功能。ExtJS是Sencha公司开发的...

    Extjs Tree + JSON + Struts2

    ExtJS Tree + JSON + Struts2 是一个常见的前端与后端交互技术组合,常用于构建动态的、数据驱动的树形结构界面。在这个项目中,`index.html` 是主页面,`tree.js` 包含了 ExtJS 的树组件相关的 JavaScript 代码,`...

    extjs ajax tree(js动态树,无需递归)

    ExtJS AJAX Tree是一种基于JavaScript的动态树形结构,它利用AJAX技术来异步加载节点数据,无需在服务器端生成完整的树结构。这种方式可以显著提高页面加载速度,尤其是在处理大量数据时。ExtJS是一个功能丰富的...

    extjs tree 节点 链接 新窗口

    在ExtJS中,Tree是一个非常重要的组件,它用于呈现层级结构的数据。在处理Tree节点时,特别是涉及到链接和新窗口打开的情况,有一些特定的技术要点需要注意。 首先,标题“extjs tree 节点 链接 新窗口”指的是在...

    extjs tree2

    ExtJS Tree2是一个基于ExtJS库的树形控件,用于构建交互式的、层次结构的数据显示和管理。这篇博客文章可能详细介绍了如何使用和自定义这个控件,但遗憾的是,由于没有提供实际的博客内容,我将根据ExtJS Tree的一般...

    extjs tree + json+struts2示例源代码

    ExtJS Tree + JSON + Struts2 示例源代码详解 在Web开发中,构建交互式的用户界面是关键。ExtJS是一个强大的JavaScript库,尤其擅长创建桌面级的Web应用。本示例将详细介绍如何结合ExtJS的Tree组件、JSON数据格式...

    extjs tree

    ExtJS Tree 是一个基于JavaScript的UI组件库ExtJS中的一个重要组成部分,用于构建可交互的树形数据结构。在Web应用程序中,它常被用来展示层级关系的数据,如目录结构、组织架构或者数据库的表关系。ExtJS Tree的...

    Extjs tree的简单小例子

    - `FormatToJson`类用于将Java对象转换为JSON格式,以便于树形结构的解析。 - 服务器返回的数据是一个JSON数组,每个对象包含`id`属性,用于标识节点。 7. **数据格式** - 返回的JSON数据表示树的节点结构,每个...

    extjs tree struts

    标题“extjs tree struts”涉及的是ExtJS框架与Struts框架在构建Web应用程序时的集成,特别是关于在页面上展示树形结构数据的应用。在Web开发中,ExtJS是一个强大的JavaScript库,提供了丰富的用户界面组件,而...

    Extjs3.2.0+asp.net动态Tree

    在“Extjs3.2.0+asp.net动态Tree”项目中,主要涉及的技术点包括: 1. **ExtJS TreePanel**:TreePanel是ExtJS中的一个组件,用于展示层级结构的数据,通常用于表示目录结构或者组织结构。在3.2.0版本中,TreePanel...

    ExtJS_Tree利用_JSON_在Struts_2实现Ajax动态加载树结点

    在本文中,我们将深入探讨如何使用ExtJS框架的Tree组件,结合JSON数据格式以及Struts 2框架,来实现Ajax动态加载树形结构的节点。这是一项常见的需求,特别是在构建可扩展、用户友好的Web应用时,动态加载的树结构...

    extjs开发tree效果

    树数据可能包含层级关系,ExtJS的TreeStore能够解析这种数据并构建树结构。 在压缩包文件"treedemo"中,可能包含了实现上述功能的源代码文件,如HTML、CSS、JavaScript以及可能的Java后端接口。解压并研究这些文件...

    Extjs 4.1 下拉框 Tree 的实现(mvc)

    本文将深入探讨如何在ExtJS 4.1环境中利用MVC架构实现一个功能丰富的下拉框(Tree ComboBox),并结合具体代码示例进行详细解析。 ### ExtJS 4.1 下拉框Tree实现(MVC) #### 1. MVC架构简介 MVC,即Model-View-...

    Extjs4 tree report

    标题“Extjs4 tree report”涉及的技术点主要集中在ExtJS 4框架的树形报表功能。ExtJS是一个用于构建富客户端Web应用的JavaScript库,它提供了丰富的组件模型和强大的数据绑定机制。在ExtJS 4中,树形控件...

    ExtJS4+Accordion+SERVLET/STRUTS2+JSON+Ext.tree.Panel实例

    总结来说,这个实例展示了如何将前端的ExtJS4框架,特别是其Accordion布局和Ext.tree.Panel组件,与Servlet和Struts2后端框架集成,利用JSON进行数据交换,来创建一个动态的、交互性强的Web应用。用户可以通过折叠和...

    extjs4 treeGrid实例

    在ExtJS4中,TreeGrid主要由`Ext.tree.Panel`类定义,它扩展了`Ext.grid.Panel`,因此具备了表格的所有功能,同时也包含了树结构的特性。 创建一个TreeGrid的第一步是定义模型(Model)。模型定义了数据的字段及其...

    extjstree源码

    EXTJS Tree是EXTJS库中的一个组件,它用于在Web应用程序中展示层次化的数据结构,也就是我们常说的树形视图。EXTJS Tree的核心功能包括基本的树操作、异步加载以及从本地或服务器获取JSON数据来构建树结构。下面我们...

Global site tag (gtag.js) - Google Analytics