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 相关文章推荐
jQuery入门知识简介
Mar 04 Javascript
JavaScript实现复制功能各浏览器支持情况实测
Jul 18 Javascript
jQuery的选择器中的通配符使用介绍
Mar 20 Javascript
2014年50个程序员最适用的免费JQuery插件
Dec 15 Javascript
手机端实现Bootstrap简单图片轮播效果
Oct 13 Javascript
H5移动端适配 Flexible方案
Oct 24 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 Javascript
js实现日历的简单算法
Jan 24 Javascript
js遮罩效果制作弹出注册界面效果
Jan 25 Javascript
js中apply()和call()的区别与用法实例分析
Aug 14 Javascript
vue 返回上一页,页面样式错乱的解决
Nov 14 Javascript
js实现翻牌小游戏
Jul 31 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控制网页过期时间的代码
2008/09/28 PHP
PHP文件读写操作之文件写入代码
2011/01/13 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
Python获取文件ssdeep值的方法
2014/10/05 Python
Python实现的检测网站挂马程序
2014/11/30 Python
一张图带我们入门Python基础教程
2017/02/05 Python
python读取Excel实例详解
2018/08/17 Python
python获取交互式ssh shell的方法
2019/02/14 Python
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
你对IPv6了解程度
2016/02/09 面试题
什么是makefile? 如何编写makefile?
2013/01/02 面试题
肯尼迪就职演说稿
2013/12/31 职场文书
迟到检讨书500字
2014/02/05 职场文书
四年大学自我鉴定
2014/02/17 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python