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 相关文章推荐
Hutia 的 JS 代码集
Oct 24 Javascript
js右键菜单效果代码
Jul 21 Javascript
javascript处理table表格的代码
Dec 06 Javascript
基于jquery循环map功能的代码
Feb 26 Javascript
JavaScript立即执行函数的三种不同写法
Sep 05 Javascript
JavaScript动态修改网页元素内容的方法
Mar 21 Javascript
javascript 将共享属性迁移到原型中去的实现方法
Aug 31 Javascript
JavaScript仿支付宝6位数字密码输入框
Dec 29 Javascript
node中使用es5/6以及支持性与性能对比
Aug 11 Javascript
vue router自动判断左右翻页转场动画效果
Oct 10 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
详解Vue中的watch和computed
Nov 09 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
转PHP手册及PHP编程标准
2006/12/17 PHP
解析PHP工厂模式的好处
2013/06/18 PHP
php对数组排序的简单实例
2013/12/25 PHP
php微信开发接入
2016/08/27 PHP
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
jcrop基本参数一览
2013/07/16 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
python内存管理分析
2015/04/08 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
Django框架模板介绍
2019/01/15 Python
Python 互换字典的键值对实例
2019/02/12 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
酒店端午节促销方案
2014/02/18 职场文书
集中采购方案
2014/06/10 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
药店促销活动总结
2014/07/10 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
民事起诉书范本
2015/05/19 职场文书
个人更名证明
2015/06/23 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
python微信智能AI机器人实现多种支付方式
2022/04/12 Python