- 浏览: 209453 次
- 性别:
- 来自: 北京
最新评论
-
Relucent:
likaiyihou51 写道The constructor ...
获得Hibernate Criteria实际SQL的方法 -
likaiyihou51:
The constructor CriteriaJoinWal ...
获得Hibernate Criteria实际SQL的方法 -
likaiyihou51:
大侠 我copy了这个代码 又个问题,能给看一下吗
获得Hibernate Criteria实际SQL的方法 -
haisee:
管用,Firefox和Chrom验证通过。
Javascript设置和获取Textarea的光标位置的方法 -
wanghaosvse:
请问楼主,有没有跟数据库同步的动态加载
带选择框的JS树控件2 (为JSTree再次提速)
以前写过一个带选择框的JS树控件
但是当时发现一个问题,第一次选中根节点会明显感觉卡一下。
那是因为子节点的数据还没有生成,选中根节点的话需要初始化全部数据。(那个tree有5000个节点)
于是我思考一个问题,如何让多节点树的页面达到更快的效率。
经过测试发现,JSTree的主要效率瓶颈在两个地方。
1.页面HTMLElement的创建
2.树子节点的检索
页面创建一个HTMLElement是很耗时的,无论使用createElement或者是是innerHTML都一样。
而且这一步只能一个节点一个节点慢慢地生成,虽然可以通过减小单个节点的HTML元素量的方法提高一些速度,但是对于对于上千个节点来说仍然需要等上几十秒。
(1个节点如果有5个HTMLElement,生成1000个节点大概3秒左右)
所以只有通过异步展示的方法来进一步减少一次生成的节点数。
页面加载时并不立即生成所有节点的HTML元素,而是用户展开多少节点就生成多少节点,节点的生成发生在用户展开这个节点的时候。 这样减少了每次生成的节点数,消除了使用者的等待时间。
而对于节点的检索,这和数据的组织方式有关。
一般的组织方式是使用数组。(解析XML的话太慢,不考虑。只考虑使用json的情况)
但是在数组中检索一个节点的效率实在不敢恭维,如果节点是N个,那么全部节点数据组装起来的效率就是N*N
在节点少的时候不明显,但是如果有1000个节点,那么明显会发觉延迟了10多秒。延迟速度按指数增加。
MzTree(梅花雪)使用了另外一种方式,他没有使用数组而是使用一个简单对象来存放数组。
并且用一个字符串存放节点的索引关系(将所有的节点名(即类的属性名)join()成一个大字符串)
当需要获得子节点的时候使用正则匹配一步获得子节点ID,从而获得子节点。
经过测试发现,使用正则匹配的算法检索节点效率比使用for循环要高出很多。
这个效率已经满足一般大数据jstree的需要。
(具体算法,去参考MzTree梅花雪)
对于一般的Tree可以通过异步初始化节点数据(不是初始化节点HTML)的方法来解决延迟。
但是如果是checkbox-tree(带选择框的树),却不能使用这个方法。因为对于带选择框的JS树,选中根节点的话,子节点应给也被选中。所以选中根节点,子节点必须存在。 所以节点数据需要一次生成。
但问题是即使使用正则匹配的算法提高了效率,仍然会需要一段初始化的时间。
(5000个节点数据全部初始化 使用for需要20-30秒,使用正则匹配算法需要6秒)
那么有没有办法进一步提高效率呢?
按照一般Tree的做法初始化一个节点数据需要初始化这个节点的子节点数据,那么也就需要检索节点的子节点数据。(有点绕口)
这个检索子节点数据看来是比较耗费时间的,而且没有更好的提高检索效率的方法。
既然检索没有办法提速,那么有没有不使用检索获得子节点的方法呢?
答案当然是有的,只要我们更改传递过去的数据结构问题迎刃而解。
于是我们直接传递一个拼装好的树结构JSON(节点包含了子节点的数据,子节点的数据中又包含了子子节点的数据....)
数据结构如下:
{
id : 0
childrean : [
{
id : 01
childrean : [
{
id : 011
childrean : [...]
},
{
id : 012
childrean : [...]
}
]
}
,
{
id : 02
childrean : []
}
]
}
对于这种结构,页面的Tree可以直接使用而无需解析,免去了子节点的检索所耗费的时间,JsTree展示速度大大提高。
一个5000节点的树,节点数据全部初始化只需要500毫秒。
(其实还有一个优点,使用这种结构的数据JSTree容易扩充,稍作修改就可以改成支持数据异步加载的Ajax-Tree)
PS:附件中是一个演示例子,虽然不是最终版本但是可以说明问题。
china_2.js 和 china_2_code.js 是节点数据(UTF-8编码)
参数说明
text 显示节点内容(必须)
id 节点id
checked 选择框选中状态 0 1 2
children 子节点数据
创建一个新节点的方法 new TreeNode( {} );
新建节点可能存在一些问题(单选框选中等问题),节点有checked属性的情况才会出现选择框。
感谢winner720发现的一个BUG
这部分代码要改一下(粗体部分) TreePanel_0.5.rar
//瀑布(遍历所有子节点)
cascade : function(fn, scope, args){
if(fn.call(scope || this, (args==null?this:args)) !== false){
var cs = this.childNodes;
for(var i = 0, len = cs.length; i < len; i++) {
cs[i].cascade(fn, scope, args);
}
}
},
(以前是 args||this,当节点checked是0的时候可能出现返回this,虽然不影响展示结果,但是会造成一定泄露。改成(args==null?this:args)就不会出现问题了)
modify:
TreePanel_test_0.x 测试演示版本
TreePanel_all.rar 完整演示版本
TreePanel_0.5.rar 修正了一个内存泄露BUG
TreePanel_2.2.zip 增加了节点全部展开和全部折叠的方法,修正了节点显示时多余的竖线
TreePanel_2.3.zip 修复节点删除时多余的竖线
备注:附件请下载最新的版本。 (旧的的版本可能存在未修改BUG,没删除只是为了留作做为备份)
这个树最初设计目的是快速展示一颗带选择框的静态树,虽然也提供了节点增加以及删除等功能,但这些没有经过仔细测试,且不是它的长项。
- TreePanel-test.0.2.rar (59.1 KB)
- 下载次数: 1463
- TreePanel-test.0.3r.rar (56 KB)
- 下载次数: 1053
- TreePanel-test.0.3_通过点击树_跳转页面的方法.zip (18.5 KB)
- 下载次数: 1011
- TreePanel_all.rar (85.2 KB)
- 下载次数: 1752
- TreePanel_0.5.rar (121.1 KB)
- 下载次数: 1334
- TreePanel_2.2.zip (84.1 KB)
- 下载次数: 1305
- TreePanel2.3.zip (84.5 KB)
- 下载次数: 1697
评论
有一点不明白:china_2.js中的pid,是不是多余的?
明白原因了,你的勾选根本没用,只有选中文本才生效
2、htm中只能引用china_2_code.js,引用china_2.js会提示JS错误(IE6)
3、建议可以设置参数,比如:自动选择子节点(只选中国,不跟选子节点),自动选择父节点(同个父节点下的子节点全选时,不自动选择父节点)。
以上希望楼主可以完善
现在需要打开页面时,展开所有结点
貌似可以在页面加载完成后,调用 expandAll()
但速度太慢了,例子中,4核CPU都需要10秒左右
能不能进入页面时,就把HTML代码写好
调用一个初始化方法,让 HTML 代码和 root 里的数据对应
(HTML代码和 root 都是写好的,只需要初始化就行了)
2、
第一个问题:
好吧,我承认。那个jquery.js是多余的,因为我压根没用到。你可以放心删掉。
otree_old.htm otree_old.js 是以前写的例子,可以一并删掉。
第二个问题:
我说的是数据一次生成,一次加载。
我的节点其实分成两部分,数据模型和 界面UI。这地方我是分开处理的(虽然看起来写到了一起)。
我的节点加载时一定存在的。因为存在的节点方便我注册以及处理。
但是界面上的element并不一定存在。因为浏览器生成一个页面元素是很耗时的。所以只有再需要展示(展开显示)的时候我才会去new一个页面元素。
如上,节点(指页面Element元素)可以在展开时才绘制的,而我也是这样做的。
2、
但是TreePanel里面有个this.nodeHash变量,记录了节点ID和节点的映射
(一个hash)。
如果是简单的搜索可以用this.nodeHash遍历所有节点。
感谢winner720发现的一个BUG
这部分代码要改一下(粗体部分)
//瀑布(遍历所有子节点)
cascade : function(fn, scope, args){
if(fn.call(scope || this, (args==null?this:args)) !== false){
var cs = this.childNodes;
for(var i = 0, len = cs.length; i < len; i++) {
cs[i].cascade(fn, scope, args);
}
}
},
以前是 args||this,当节点checked是0的时候可能出现返回this的BUG,改成(args==null?this:args)就不会出现问题了。
= =!
你在提出问题之前难道从不自己看代码吗?
TreePanel.html 31行 alert( (new Date().getTime()-l0));
var L = new Date().getTime(); tree = new TreePanel({ 'root' : root }); tree.render(); alert( (new Date().getTime()-L));
那个 alert 打印的是初始化Tree花费的时间。
这只能说明不同浏览器初始化Tree的速度不一样。
说Chrome刷出这个树花了108毫秒,FireFox用了107毫秒,IE6用了815毫秒。
(PS:顺便说一下这个树大约有3525个节点。)
发表评论
-
【转】Closure Compiler 高级模式及更多思考(js文件压缩工具 )
2011-03-16 13:05 1997【转】Closure Compiler 高级模式及更多思考 ... -
Base64编码解码(JavaScript版本)
2010-12-17 10:24 2855<html> <HTML> < ... -
JavaScript 中2个等号与3个等号的区别
2010-12-07 13:21 25384首先,== equality 等同,=== identity ... -
JS前端获取上传文件的大小的方法
2010-11-01 11:04 23533WEB应用中,经常会遇到上传附件的问题,比如有时候会有限制附件 ... -
Javascript设置和获取Textarea的光标位置的方法
2010-07-20 11:05 6640<html><head> <m ... -
ExtJS 3.1.0 中Ext.data.Store关于baseParams的BUG修正
2010-07-15 09:59 5004ExtJs 中,我们使用GirdPanel的时候往往需要给后 ... -
JavaScript JSON 对象深拷贝方法(一例)
2010-07-14 20:08 6507其实深拷贝一个JS对象方法十分简单,只需要两部 1.首先将J ... -
关于Extjs异步session超时问题处理
2010-07-08 17:46 4051关于Extjs异步session超时问题处理对于HTTP超时的 ... -
ExtJS 的组建扩展方法
2010-07-08 17:19 2266ExtJS 是一个不错的JS 类库,提供了很多组建。 ... -
JS 地图移动拖拽
2010-05-26 09:06 2810很简单的东东,就是类似google地图那样,可以拖拽图片。 ... -
JS移动的方块
2010-05-21 09:00 1412PS:WASD上下左右,双击加速. 同时按下WASD任意2个按 ... -
JS对象序列化为JSON对象
2010-04-17 10:07 10725/** * JSON 解析类 * Copyright ... -
JavaScript日期格式化
2010-03-17 11:17 1586DateFormat = (function(){ ... -
Ext智能提示 - Spket(Eclipse插件)
2009-10-23 13:01 2012Spket是Eclipse的一个插件,RIA的开发工具。支持J ... -
带选择框的JS树控件
2009-10-12 11:09 2115前阵子自己写了个带选择框的tree控件,虽然还有一些bug没有 ... -
多附件上传
2008-10-29 23:48 1510uploads.js var UploadBuilder=(f ... -
HTML通过button触发input-file控件上传文件的问题
2008-10-20 10:32 25657出于安全方面的考虑,通过JS修改input-file的valu ... -
模拟线程Timer(JS)
2008-09-22 09:06 1901<script language="Java ... -
转换Unicode (JS)
2008-09-02 17:34 2645<html> <head> ... -
JS-Cookie
2008-08-05 11:33 1361/** * cookie管理对象 */ Cook ...
相关推荐
3. **初始化jsTree**:使用`$(selector).jstree(options)`方法初始化树控件,`selector`是树容器的选择器,`options`是一个包含配置项的对象,用于设置初始状态、加载数据的方式、使用的插件等。 4. **处理事件**:...
总之,`jstree` 是一个强大且灵活的 JavaScript 树形控件,能够满足各种树状结构的展示需求。通过深入了解其核心特性和用法,开发者可以轻松地将其集成到项目中,提升用户体验。同时,遵循最佳实践,可以确保项目的...
JavaScript(简称JS)是一种广泛用于网页...总的来说,jsTree是一个强大且灵活的JavaScript树形控件,能够帮助开发者快速构建具有交互性的树状结构。通过深入理解和熟练运用,可以提升Web应用的用户体验和功能完整性。
jsTree是一款功能丰富的JavaScript库,专为在Web应用中实现交互式的树形结构而设计。它基于流行的jQuery框架,允许开发者轻松地在网页上创建和管理树形结构。jsTree不仅提供了基本的树节点操作,如创建、重命名、...
在Windows Presentation Foundation (WPF) 中,开发人员经常需要创建具有多选功能的树形控件,以便用户能够同时选择多个节点。标题“WPF_多选树控件.zip”暗示了一个实现这种功能的示例项目,其中包含了如何在WPF...
jsTree是一款基于JavaScript的开源库,专用于创建交互式的树形数据结构,通常被用作网页中的导航菜单或数据组织工具。它支持多种数据源,如JSON、HTML、XML等,并提供了丰富的API和事件系统,使开发者能够自定义行为...
总的来说,"带复选框JS树"是前端开发中一种重要的交互元素,结合了数据结构、用户界面设计和JavaScript编程技术,为用户提供了一种直观的方式来操作和管理层次化数据。通过学习和掌握这种技术,开发者可以提升用户...
在本文中,我们将深入探讨如何在AngularJS框架中实现下拉树控件,这是一种结合了树形结构和下拉选择功能的用户界面组件。AngularJS是Google开发的一个强大的前端JavaScript框架,它允许开发者构建可维护、可扩展的...
4. `widgetTreeList.js`:这是树形控件的主要JavaScript实现,包含了所有必要的逻辑和功能,如展开/折叠节点、添加/删除节点、选择节点等。 5. `jQuery Treelist widget_files`:这个文件夹很可能包含了其他支持...
JavaScript(简称JS)树形控件是一种在网页中展示层级数据结构的交互式元素,它通常用于展现目录结构、组织架构、文件系统等。在网页设计中,这种控件能够帮助用户以图形化的方式理解复杂的数据关系,通过展开、折叠...
`dtree`可能是另一种JavaScript树形菜单库,虽然不是`jstree`,但它可以让你对比不同库的优缺点,选择最适合你的解决方案。 8. **纯JavaScript+树形菜单.rar** 这个例子强调了`jstree`是完全基于JavaScript的,不...
JavaScript树形控件是一种在网页中用于展示层次结构数据的交互式组件,它通常以节点的形式呈现,每个节点可以展开或折叠,展示其子节点。这种控件在各种应用场景中非常常见,例如文件目录浏览、组织结构展示、菜单...
综上所述,jstree是一个强大的JavaScript工具,适用于构建互动式的树形菜单和导航,其代码结构清晰,注释丰富,便于学习和使用。对于需要在Web应用中展示层级数据的j2ee开发者来说,jstree是一个非常有价值的资源。
jsTree 支持多种插件来扩展其功能,如 `checkbox` 插件实现复选框选择,`contextmenu` 插件添加右键菜单,`types` 插件定义不同类型的节点样式等。例如,启用 `checkbox` 插件: ```javascript $('#jstree').jstree...
jsTree 是一个流行的 JavaScript 库,专门用于创建、操作和展示交互式的树型结构。在 Web 开发中,它常被用于构建目录结构、组织数据或者构建导航菜单。jsTree 提供了丰富的 API 和多种主题,以适应不同的项目需求。...
jsTree 是一个基于 JavaScript 的开源库,专为创建交互式的树状视图而设计。它提供了丰富的功能,如动态加载、增删节点、拖放操作等,使得在网页中实现复杂的数据结构展示变得简单。jsTree 支持多种数据源,包括 ...
选择日期控件(js封装类,javascript,选择日期,文本框选择日期,控件)
**jsTree:一个强大的JavaScript树视图库** jsTree是一个基于JavaScript的开源库,用于创建交互式的树形结构。它支持HTML、JSON等多种数据格式,适用于构建目录结构、文件系统或者复杂的组织架构。jsTree提供了丰富...
总结来说,jstree是一个强大的JavaScript树形组件,通过其丰富的功能和易于使用的API,可以帮助开发者快速构建交互式的树形界面。无论是用于数据展示还是用户操作,jstree都是一个理想的选择。通过深入学习和实践,...
2. **数据绑定**:树形控件的数据来源可以是数组或簇,它们代表了树形结构的各个层级。使用“编辑数据绑定”选项,将控件与VI的变量进行连接,这样当数据改变时,树形控件会自动更新,反之亦然。 3. **事件处理**:...