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 multibox 全选
Mar 22 Javascript
javascript 一个函数对同一元素的多个事件响应
Jul 25 Javascript
IE和firefox浏览器的event事件兼容性汇总
Dec 06 Javascript
jquery radio 操作代码
Mar 16 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
JS实现淘宝幻灯片效果的实现方法
Mar 22 Javascript
js保留小数点后几位的写法
Jan 03 Javascript
javascript面向对象之定义成员方法实例分析
Jan 13 Javascript
jQuery三级下拉列表导航菜单代码分享
Apr 15 Javascript
深入浅析JavaScript面向对象和原型函数
Feb 06 Javascript
ionic grid(栅格)九宫格制作详解
Jun 30 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
Aug 24 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
怎么使 Mysql 数据同步
2006/10/09 PHP
在字符串指定位置插入一段字符串的php代码
2010/02/16 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
php常用数学函数汇总
2014/11/21 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
Python创建日历实例
2014/08/21 Python
Django与JS交互的示例代码
2017/08/23 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
结婚典礼证婚词
2014/01/11 职场文书
旷课检讨书2000字
2014/01/14 职场文书
社区学习十八大感想
2014/01/22 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
公务员个人考察材料
2014/12/23 职场文书
2016春节慰问信范文
2015/03/25 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle