原文地址;https://segmentfault.com/a/1190000004657854

  最近公司做一个项目用到zTree,zTree功能强大就不用多说了,相信用过的人都知道。
       公司项目因为要展示的节点非常多,所以要求要实现搜索节点的功能,zTree确实很强大,它提供了getNodesByParamByFuzzy(key, value, parentNode)方法可根据关键字进行模糊查询得到想要的节点,极其方便。但是问题来了,因为要读取节点的数据量很大,节点的数量有几万个甚至更多,考虑到性能和时间上的问题,因此不能一次性把全部节点数据读取出来,这里我采用的是zTree自带的分批异步加载模式。但是这样就又造成了另外一个问题,再使用getNodesByParamByFuzzy这个方法时便只能找到已经加载出来的节点,而无法找到还没有进行加载的节点,从而使用户体验不好。
       为了解决这个问题,刚开始的想法是每次都去数据库查询数据,每次只显示搜索到的第一条结果,然后再进行下一条查询,查到最后一条时又返回第一条,事实这样的思路是行的通的,但是这样实现起来非常麻烦,而在项目中通常都不止一棵树,难不成每棵树都要这样,为了这小小的功能却要写如此多的代码实在恶心,废话不多说,下面是我自己想的认为比较好的方法。看下面代码:

// 节点加载完的回调函数,加载方式依旧是分批加载,但是不是等用户展开节点才去加
// 载,而是让它自动完成加载,这里不好的地方是依旧要加载全部数据,所以必须等待
// 它加载完才能使用搜索功能
function onAsyncSuccess(event, treeId, treeNode, msg) {
var zTreeObj = $.fn.zTree.getZTreeObj();
// 这个方法是将标准 JSON 嵌套格式的数据转换为简单 Array 格式
var nodes = zTreeObj.transformToArray(zTreeObj.getNodes());
for (var i = 0; i < nodes.length; i++) {
// 判断节点是否已经加载过,如果已经加载过则不需要再加载
if (!nodes[i].zAsync) {
zTreeObj.reAsyncChildNodes(nodes[i], '', true);
}
}
}

所以还必须定义多一个判断树节点是否已经全部加载完的方法。这个方法我是参考《精通JavaScript》上面关于等待页面加载完的方法来写的

function treeAsyncReady(treeId, f) {
// 如果树已经加载完,马上执行函数
if (treeAsyncReady.done) {
return f();
} var zTreeObj = $.fn.zTree.getZTreeObj(); treeAsyncReady.timer = setInterval(function() {
if (treeAsyncReady.done) {
return false;
} // 获取没有异步加载过的节点
var nodes = zTreeObj.getNodesByFilter(funciton(node) {
return !node.zAsync;
});
// 如果节点数为零则说明已经加载完
if (nodes.length == 0) {
clearInterval(treeAsyncReady.timer);
treeAsyncReady.timer == null; // 执行函数
f(); treeAsyncReady.done = true;
}
}, 13);
}

定义了这个方法,然后就可以在这个方法实现实现你要搜索的功能了

treeAsyncReady('treeId', function() {
// 在这里写搜索节点的代码
...
});

zTree分批异步加载方式下实现节点搜索功能(转载)的更多相关文章

  1. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载

     在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一 ...

  2. ztree插件异步加载 使用RESTEasy报错 Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

    在使用ztree插件实现异步加载时遇到后台RESTEasy接收参数问题,查看后台报错: A servlet request to the URI http://localhost:8080/area/ ...

  3. zTree设置异步加载后展开

    //不能直接配置展开属性 因为没有数据,需要添加回调函数,异步加载成功展开 callback: { onAsyncSuccess: zTreeOnAsyncSuccess } //异步加载成功回调函数 ...

  4. ztree的异步加载

    js中代码为: //参数设置: var setting = { async: { enable: true,    url:"<%=path%>/role/getTreeData ...

  5. 运用requirejs的异步加载方式

    很容易让人以为是权重出问题了,但就我自己多个项目动画导出的经验来看,大 我们说程序员核心能力有以下几点:自学能力,解决问题的能力,团队合作能力.自学可以让我们在这个日新月异的时代不被淘汰;解决问题可以 ...

  6. zTree异步加载展开第一级节点

    在 setting 中的 callback 中加上 onAsyncSuccess:onAsyncSuccess 回调函数 , 然后实现回调函数 var isFirst = true;function ...

  7. Ztree异步加载自动展开节点

    在Ztree的官网Demo中,有自动展开的例子,是通过设置节点属性open:true来实现自动展开的,但是在异步加载中,这个属性设置为true也不会自动展开,因为open:true是指在有子节点的情况 ...

  8. JS异步加载的三种方式

    js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作. 有些工具方法需要按需加载,用到再加载,不用不加载,. 默认正常 ...

  9. 点评js异步加载的4种方式

    主要介绍了点评js异步加载的4种方式,帮助大家更全面的了解js异步加载方式,感兴趣的小伙伴们可以参考一下 js异步加载的4种方式,点评开始. <!DOCTYPE html> <htm ...

随机推荐

  1. C语言--成绩汇总(5班)

    一.成绩列表 第0周成绩:[http://www.cnblogs.com/ranh941/p/7587567.html] 第1周成绩:[http://www.cnblogs.com/ranh941/p ...

  2. Web应用 布局

    asp.net core系列 44 Web应用 布局 一.概述 MVC的视图与Razor页面经常共享视觉和程序元素,通过使用布局来完成,布局还可减少重复代码.本章演示了以下内容的操作方法:(1)使用通 ...

  3. Ideal部署web工程

  4. 10 HashMap,Map.Entry,LinkedHashMap,TreeMap,Hashtable,Collections类

    Map集合的功能概述 添加功能 * V put(K key,V value):添加元素.            * 如果键是第一次存储,就直接存储元素,返回null            * 如果键不 ...

  5. 【SpringCloud】初识springCloud

    转载来源:https://maimai.cn/article/detail?fid=1149221357&efid=lL_Z3WzTyUDLAjQwrNrIsw 概述 毫无疑问,Spring ...

  6. 使用patroni 构建高可用的pg 数据库

    patroni 是一个基于zk.etcd .consul 等的pg ha 模版,我们可以使用这个工具,快速的搭建一套 pg 的高可用方案 环境准备 mac 操作系统 安装基础差组件 brew inst ...

  7. auto sudo password in shell

    here is the example how to implement the auto password in shell script. Echo yourpasswordhere | sudo ...

  8. C# to IL 3 Selection and Repetition(选择和重复)

    In IL, a label is a name followed by the colon sign i.e ":". It gives us the ability to ju ...

  9. 如何对 PHP 代码加密?

    这几天有同事问如何对 PHP 代码进行加密? 在我印象中 PHP 加密还是比较麻烦的,之前只知道 Zend Guard . 刚刚找了一圈发现现在还是有很多可行的方案,先记录一下,以后使用. 使用混淆 ...

  10. laravel 事务处理

    //開啟事務 DB::beginTransaction(); try { //賬號密碼同步到後台登錄表 $user = new \App\Models\User; $user->name = $ ...