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 相关文章推荐
Js的MessageBox
Dec 03 Javascript
javascript parseInt与Number函数的区别
Jan 21 Javascript
为Extjs加加速(javascript加速)
Aug 19 Javascript
了不起的node.js读书笔记之node的学习总结
Dec 22 Javascript
AngularJS基础 ng-init 指令简单示例
Aug 02 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
Apr 12 Javascript
详谈for循环里面的break和continue语句
Jul 20 Javascript
详解bootstrap导航栏.nav与.navbar区别
Nov 23 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
Jun 07 Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 Javascript
nuxt 实现在其它js文件中使用store的方式
Nov 05 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中防止恶意刷新页面的代码小结
2012/10/31 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
日期 时间js控件
2009/05/07 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
vue计算属性及使用详解
2018/04/02 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
Python函数式编程指南(四):生成器详解
2015/06/24 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python适配器模式代码实现解析
2019/08/02 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
会计职业生涯规划书
2014/01/13 职场文书
一年级小学生评语大全
2014/12/25 职场文书
电影红河谷观后感
2015/06/11 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
Vue全家桶入门基础教程
2021/05/14 Vue.js
python开发人人对战的五子棋小游戏
2022/05/02 Python