ztree获取选中节点时不能进入可视区域出现BUG如何解决


Posted in Javascript onDecember 03, 2015

zTree 是一个依靠 jQuery 实现的多功能 “树插件”。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点。

zTree 的特点编辑

● zTree v3.0 将核心代码按照功能进行了分割,不需要的代码可以不用加载
● 采用了延迟加载技术,上万节点轻松加载,即使在 IE6 下也能基本做到秒杀
● 兼容 IE、FireFox、Chrome、Opera、Safari 等浏览器
● 支持 JSON 数据
● 支持静态和 Ajax 异步加载节点数据
● 支持任意更换皮肤 / 自定义图标(依靠css)
● 支持极其灵活的 checkbox 或 radio 选择功能
● 提供多种事件响应回调
● 灵活的编辑(增/删/改/查)功能,可随意拖拽节点,还可以多节点拖拽哟
● 在一个页面内可同时生成多个 Tree 实例
● 简单的参数配置实现 灵活多变的功能

zTree 的优势编辑

zTree 的作者利用业余时间不断改进 zTree 功能,并且还能及时与用户沟通,及时回复各种疑问,便于新用户快速掌握。目前越来越多的用户都使用 zTree 替换了系统中原有的 树插件,这其中包括最近刚发布最新版本的QUI框架。

相关插件版本:

jquery.ztree.exedit-3.4.js

jquery.ztree.all-3.4.js

jquery-1.8.0.js

function onAsyncSuccess(event, treeId, treeNode, msg) {
     curAsyncCount--;
     if (curStatus == "expand") {
       expandNodes(treeNode.children);
     } else if (curStatus == "async") {
       asyncNodes(treeNode.children);
     } 
     if (curAsyncCount <= ) {
       curStatus = "";
       // 节点定位
       if(devicesSelect.selectNodeId){
         // 节点变成被选中状态
         var zTree = $.fn.zTree.getZTreeObj(zTreeId);
         zTree.cancelSelectedNode();
         $("#" + devicesSelect.selectNodeId + "_a").addClass("curSelectedNode");
         $("#treeDiv").animate({scrollTop:$("#"+devicesSelect.selectNodeId).offset().top-},);//是ms,也可以用slow代替
         devicesSelect.selectNodeId = "";
       }
     }
   } 
   function expandNodes(nodes) {
     if (!nodes) return;
     curStatus = "expand";
     var zTree = $.fn.zTree.getZTreeObj(zTreeId);
     for (var i=, l=nodes.length; i<l; i++) {
       if(ids.indexOf(nodes[i].id) != -){
         if (nodes[i].isParent&&(ids.substring(,ids.indexOf(","))!=nodes[i].id)) {
           if(nodes[i].typeName.indexOf("虚拟")=="-"){
             zTree.expandNode(nodes[i], true, false, false);
           } else if(nodes[i].type.indexOf(type)>"-"){
             zTree.expandNode(nodes[i], true, false, false);
           }
         } else {
           goAsync = true;
         }
       }
     }
     if(goAsync==true){
       var id_ = ids.substring(,ids.indexOf(","));
       var node = zTree.getNodeByParam("id",id_);
       goAsync = false;
       me.curStatus = "";
       me.type = "";
       me.selectNodeId = node.tId;
     }
   }

定位思路:

1、假设要定位节点A,该节点A的唯一标识是objid

2、根据objid从db中获取所有上级的objid,拼接并保存在ids变量。

3、在onAsyncSuccess方法中调用expandNodes,该方法中通过[if (nodes[i].isParent&&(ids.substring(0,ids.indexOf(","))!=nodes[i].id))]过滤,展开id在ids里的节点。

4、通常情况看下,在展开最后,依据objid通过【var node = zTree.getNodeByParam("id",id_);】获取节点A对象,然后通过【zTree.selectNode(node);】选择节点。

这种情况下,能够定位并选择目标节点,但是,当与该节点有同一父节点的数据较多时,节点A可能不会出现在可视区域内。查找源码,发现Ztree用的是【$("#" + node.tId).focus().blur();】方法实现定位。但很遗憾,有BUG。

于是,使用控制滚动条的方式自己控制定位。实现方式如下:

1、删除【zTree.selectNode(node);】,防止定位冲突

2、在onAsyncSuccess方法中,判定当节点展开完毕后,获取节点A的偏移量,并将值赋给树所在DIV的scrollTop属性。

$("#treeDiv1").animate({scrollTop:$("#"+devicesSelect.selectNodeId).offset().top-300},1000);//1000是ms,也可以用slow代替

注:devicesSelect.selectNodeId为节点A的节点tid,通过【me.selectNodeId = node.tId】获取;treeDiv1树所在div的id属性

3、取消之前选中节点:zTree.cancelSelectedNode();

4、为节点A增加被选中状态class:$("#" + devicesSelect.selectNodeId + "_a").addClass("curSelectedNode");

笔者淡淡的说:第2点我本来想用【$("#treeDiv1").scrollTop($("#"+devicesSelect.selectNodeId).offset().top-200);】这种方式的,虽然有效,但是同层节点过多时候,还是不能进入可视区域,我深深的怀疑是因为这个时候树还没展开,所以我就用了动画,无赖之举。

笔者最后的话:如果本文有任何错误,敬请看官火辣指出,不胜感激涕零。。。。

以上内容是本文给大家介绍ztree获取选中节点时不能进入可视区域出现BUG如何解决的全部叙述,希望大家喜欢。

Javascript 相关文章推荐
Javascript变量函数浅析
Sep 02 Javascript
js时间戳格式化成日期格式的多种方法
Nov 11 Javascript
jqgrid 表格数据导出实例
Nov 21 Javascript
jQuery选择器全面总结
Jan 06 Javascript
js确认删除对话框效果的示例代码
Feb 20 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
Apr 04 Javascript
JavaScript使用concat连接数组的方法
Apr 06 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
Jun 06 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
Aug 24 Javascript
Vue函数式组件-你值得拥有
May 09 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
May 27 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
Dec 03 #Javascript
JS使用post提交的两种方式
Dec 03 #Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
Dec 03 #Javascript
五种js判断是否为整数类型方式
Dec 03 #Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
Dec 03 #Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
Dec 03 #Javascript
学习JavaScript设计模式(代理模式)
Dec 03 #Javascript
You might like
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
一个JS翻页效果
2007/07/23 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
Python通过文本和图片生成词云图
2020/05/21 Python
深入了解NumPy 高级索引
2020/07/24 Python
python如何操作mysql
2020/08/17 Python
Python list和str互转的实现示例
2020/11/16 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
2020/11/28 Python
详解Python中的Lock和Rlock
2021/01/26 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
为你的html5网页添加音效示例
2014/04/03 HTML / CSS
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
领导的自我鉴定
2013/12/28 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
商务英语广告词大全
2014/03/18 职场文书
小学生思想品德评语
2014/12/31 职场文书
个人维稳承诺书
2015/05/04 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
P站美图推荐——变身女主角特辑
2022/03/20 日漫
MySQL如何使备份得数据保持一致
2022/05/02 MySQL