`
zpball
  • 浏览: 910134 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ExtJs TreePanel使用TreeLoader在IE下无法正常加载显示的解决方法

ext 
阅读更多
小菜使用如下代码生成TreePanel,代码与ExtJs自带的examples类似,在Firefox下运行正常,不过在IE下无法正常显示。

<script language="JavaScript" type="text/javascript">
    <!--
    Ext.BLANK_IMAGE_URL = '../resources/ext/resources/images/default/s.gif';

    Ext.onReady(function() {
        var ddTree = new Ext.tree.TreePanel({
            el: 'ddTree',
            useArrows: true,
            enableDD: true,
            width: 200,
            height: 300,
            loader: new Ext.tree.TreeLoader({
                dataUrl: "xxx.ashx"
            }),
            rootVisible: false,
            root: new Ext.tree.AsyncTreeNode({}),
            listeners: {
                'beforeload': beforeloadHandler,
                'load': loadHandler
            }
        });

        ddTree.render();
        ddTree.expandAll(); // 展开所有结点

     var loading = null;
        function beforeloadHandler() { // 加载前事件响应处理
            loading = new Ext.LoadMask(Ext.get(ddTree.getEl()), { msg: "请等待" });
            loading.show();
        }

        function loadHandler() { // 加载后事件响应处理
            loading.hide();
        }
    });
    -->
    </script>


分析问题:
1、是否是xxx.ashx出现异常?
     使用Firefox工作正常,所以排除,并且通过Firebug取到xxx.ashx输出json数据如下,所以该可能排除。
[{"id":59,"text":"web development","leaf":false,"children":[{"id":60,"text":"asp.net","leaf":false,"children":[]},{"id":61,"text":"php","leaf":false,"children":[]}]},{"id":62,"text":"web development","leaf":false,"children":[{"id":63,"text":"asp.net","leaf":false,"children":[]},{"id":64,"text":"php","leaf":false,"children":[]}]}]

2、TreePanel不兼容IE?
  这显然是个笑话。不过可以验证下,将Firebug取到的json数据放入root结点的children: json。在IE下工作正常。所以该可能排除。
3、TreeLoader在IE下工作不正常?
  暂时其它可能排除了,所以就它最可能了。
  那怎么解决呢?可以使用Ajax取到xxx.ashx传来的数据,然后转为json放入root结点的children就ok了。试下。
<script language="JavaScript" type="text/javascript">
    <!--
    Ext.BLANK_IMAGE_URL = '../js/ext/images/default/s.gif';

    Ext.onReady(function() {
        var forumTree = new Ext.tree.TreePanel( {
            el: 'forumtree',
            useArrows: true,
            enableDD: true,
            width: 200,
            height: 300,
            rootVisible: false,
            root: new Ext.tree.AsyncTreeNode({})
        });
        
        forumTree.render();
        
        // 加载提示
        var loading = null;
                
        function showLoading() {
            loading = new Ext.LoadMask(Ext.get(forumTree.getEl()), { msg: "请等待" });
            loading.show();
        }

        function hideLoading() {
            loading.hide();
        }
        
        showLoading();
        
        // 由于使用TreeLoader在IE下无法正常加载数据,所以使用Ajax先获取数据再填充数据到root node下 
        Ext.Ajax.request({
            url: 'xxx.ashx',
            success: function(request) {
                var data = Ext.util.JSON.decode(request.responseText);
                forumTree.getRootNode().appendChild(data);
                forumTree.getRootNode().expandChildNodes(true);
                
                hideLoading();
            },
            failure: function() {
                hideLoading();
                
                Ext.MessageBox.show({
                    title: '版块管理',
                    msg: '对不起,加载数据出现异常,请重试!',
                    buttons: Ext.MessageBox.OK,
                    icon: Ext.MessageBox.ERROR
                });
            }
        });
    });
    -->
    </script>



问题解决。。。

不过这样我们又会碰到一个问题,就是当CRUD这个树结点提交到Server后,如何刷新Tree。如果只是重新调用Ajax。会有重复的结点出现。
因为上面使用的是在root下用appendChild来实现。所以刷新时应该先删除root下的所有子结点。怎么删呢?
forumTree.root.removeChildNodes()?噢,sorry。这个方法不存在。简单我们自己来一个。

function removeChildNodes(node) {
            while(node.firstChild) {
                removeChildNodes(node.firstChild);
            }
  
            if(node.getDepth() != "0") {
                node.remove();
            }
        }


在刷新的时候只要把forumTree.root传入该方法就可以了。
分享到:
评论

相关推荐

    extjs TreePanel

    通过这些配置项和方法,开发者可以构建动态、交互性强的EXTJS TreePanel,实现数据的加载、节点的操作和用户交互。例如,可以设置`rootVisible`为`false`隐藏根节点,使用`loader`配置项定制数据加载逻辑,通过`...

    ExtJS 3.4关于TreePanel的一些实例

    2. 使用TreeLoader加载数据生成树 3. 读取本地Json数据生成树 4. 使用Servlet提供数据 5. 树的事件 6. 右键菜单 7. 修改节点的默认图标 8. 给节点增加提示信息 9. 为节点设置超链接 10. 编辑节点名称 11. 树形的拖放...

    Extjs 动态加载树

    标题“Extjs 动态加载树”涉及到的是一个前端开发技术话题,主要集中在使用Extjs框架构建能够动态加载数据的树形结构。Extjs是一个基于JavaScript的组件化UI库,常用于开发富客户端应用。动态加载树(Dynamic ...

    extjs兼容dwr的代理和DWRTreeLoader

    本主题将深入探讨如何在ExtJS中使用DWR的代理(DWRProxy)以及树结构加载器(DWRTreeLoader),以便于在ExtJS组件,特别是树形控件中有效地利用DWR的功能。 首先,让我们了解DWRProxy。DWRProxy是ExtJS中用于与DWR...

    Extjs tree的简单小例子

    在本文中,我们将深入探讨EXTJS中的树形组件(TreePanel),以及如何创建一个简单的异步加载和拖放功能的示例。EXTJS TreePanel 是一个强大的组件,用于展示层次结构数据,通常用于组织目录、文件系统或组织结构等。...

    Extjs4.2 MVC 左菜单动态加载功能

    5. **异步加载**:使用TreeLoader的`load`方法,传入要加载的节点,服务器返回该节点的子节点数据。 6. **服务端接口**:后端需要提供一个接口,接收父节点ID,返回该节点的子节点数据。通常采用JSON格式,每个对象...

    JavaScript的ExtJS框架中数面板TreePanel的使用实例解析

    TreePanel是ExtJS框架中用于显示树状结构数据的组件,非常适合展示具有层次结构的信息,如文件系统、部门结构等。TreePanel组件可以处理复杂的树形结构,提供展开和折叠节点的功能,使得用户可以逐级浏览数据。 在...

    Ext.tree.TreeLoader附带封装的json类

    4. **load**: 加载数据的方法,可以在此方法中处理数据解析和节点创建。 5. **params**: 发送请求时附带的额外参数。 JSON数据结构对于`TreeLoader`来说非常重要。一个适合树形视图的JSON数据应该包含以下元素: -...

    Extjs Json树封装

    在本文中,我们将深入探讨"Extjs Json树封装"这一主题,包括如何使用JSON数据加载树形结构,以及涉及到的相关工具和源码。 首先,我们需要理解JSON树的概念。在ExtJS中,一个JSON树是由多个JSON对象组成的,每个...

    extjs 总结

    在EXTJS中,TreePanel是用于展示树形数据结构的组件,广泛应用于组织层次结构信息,如文件系统、组织架构等。 **EXTJS TreePanel 知识点** 1. **配置项** - `root`: TreePanel 的根节点,通常是整个树的起点。 -...

    Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码

    TreePanel继承自Panel,在ExtJS中使用树控件含有丰富的属性和方法实现复杂的功能。其中Ext.tree.TreeNode代表一个树节点,比较常用的属性包括text、id、icon、checked等、异步树Ext.tree.AsyncTreeNode、树加载器Ext...

    Extjs入门之动态加载树代码

    `TreePanel`是Extjs提供的树形控件,`TreeLoader`负责从服务器端加载数据。`dataUrl`属性指定了获取树形结构数据的URL,而`requestMethod`则定义了请求类型。 #### 五、小结 本文介绍了如何在Extjs中实现动态加载...

    JavaScript的ExtJS框架中数面板TreePanel的用法实例解析_.docx

    在JavaScript的ExtJS框架中,TreePanel是一种强大的组件,它用于展示树形结构的数据,尤其适合处理JSON格式的信息。TreePanel允许用户以交互的方式浏览层级化的数据,这在很多应用场景中,如文件系统、组织结构或者...

    带复选框的 ExtJs tree

    在IT领域,特别是Web开发中,使用ExtJS创建复杂且交互丰富的用户界面是常见的实践。在给定的文件中,我们关注的是“带复选框的ExtJS tree”这一主题,这涉及到ExtJS框架下的树形组件(TreePanel)如何与复选框结合,...

    treepanel动态加载数据实现代码

    在本文中,我们将深入探讨如何在ExtJS的TreePanel组件中实现动态加载数据。TreePanel是ExtJS库中的一个功能强大的组件,它允许用户以树形结构展示数据。动态加载数据是一种优化用户体验的方法,只有当用户展开节点时...

    ExtJS4学习笔记十一 树控件的使用

    在本篇《ExtJS4学习笔记十一:树控件的使用》中,我们将深入探讨ExtJS框架中的树形控件(TreePanel),这是一种强大的UI组件,用于展示层次结构的数据。ExtJS4对树控件的功能进行了增强,使其更加灵活且易于使用。...

    使用ExtJs构建树形菜单功能

    在ExtJs中,可以使用`Ext.tree.TreeNode`类来创建节点,并通过`appendChild`方法将子节点添加到父节点下。 ```javascript var root = new Ext.tree.TreeNode({ text: '区域信息' }); var node1 = new Ext.tree....

    Extjs chekboxtree PagingTreeLoader 多选、分页

    在IT领域,ExtJS是一个广泛使用的JavaScript库,用于构建富客户端Web应用程序。它提供了一整套组件,包括表格、树形视图、图表等,帮助开发者创建交互式、功能丰富的用户界面。本篇将深入探讨ExtJS中的"Chekboxtree...

    ExtJs Tree

    - **异步加载**:通过`Ext.tree.TreeLoader`实现数据的异步加载,其中`dataUrl`指定了获取数据的URL路径。 - **根节点配置**:通过`root`属性指定树的根节点,该节点可配置自己的`text`、`iconCls`和`id`等属性。 #...

Global site tag (gtag.js) - Google Analytics