jQuery zTree 异步加载添加子节点重复问题


Posted in jQuery onNovember 29, 2017

zTree 简介

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

    zTree 是开源免费的软件(MIT 许可证)。如果您对 zTree 感兴趣或者愿意资助 zTree 继续发展下去,可以进行捐助。

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

原始问题

//添加结点, 产品和版本
function addNode(event) {
  rMenu.css({ "visibility": "hidden" });
  var treeNode = zTree.getSelectedNodes()[0];
  var pid;
  var nodeName;
  var treelevel;
  if (!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) {
   //添加产品结点
pid = 0;
   treeNode = null;
   treelevel = 1;
  } else if (treeNode) {
   //添加版本结点
pid = treeNode.id;
  treelevel = 2;
  }
  $.post(
   "AddNode.action",
   { type: treelevel, id: pid },
   function(nodeIdAndName) {
    var params = /([^\|]+)\|([^\|]+)/.exec(nodeIdAndName);
    if (!((!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) || treeNode.open)) {
     zTree.expandNode(treeNode, true);
    }
    treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
   });
}

原本直接添加子节点的时候,如果父节点没有展开,会添加两个一样的子节点(第一次的时候);后来我对父节点是否展开进行了判断,但是却变成了如果父节点展开,会添加两个一样的子节点(第一次的时候),这个问题要怎么解决呢?

办法一 

if (!((!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) || treeNode.open)) {
     zTree.expandNode(treeNode, true);
    }
    treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });

改成

if(!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0)
    {
     treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
    }
    else if(treeNode.open)
    {
     if(treeNode.isParent)
     {
      zTree.reAsyncChildNodes(treeNode, "refresh");
     }
     else
     {
      treeNode.isParent=true;
      zTree.reAsyncChildNodes(treeNode, "refresh");
     }
    }
    else
    {
     zTree.expandNode(treeNode, true);
     treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
    }

问题就可以解决了,但是有没有优化呢?感觉改后的代码分类太多了 

最优办法

貌似不用这么麻烦吧?前两天回答了类似的问题。

1、点击添加子节点后,就直接 ajax 传给后台保存数据,捕获 success 事件

2、ajax success 时,利用 treeNode.zAsync 属性就可以知道此父节点是否进行过异步加载,如果为 false 那么直接 reAsyncChildNodes 刷新, 如果为 true 那么利用 addN...

if ((!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) || treeNode.zAsync) 
     treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
    else
     zTree.reAsyncChildNodes(treeNode, "refresh");

总结

以上所述是小编给大家介绍的jQuery zTree 异步加载添加子节点重复问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

jQuery 相关文章推荐
jquery append与appendTo方法比较
May 24 jQuery
解决jQuery ajax动态新增节点无法触发点击事件的问题
May 24 jQuery
jQuery validata插件实现方法
Jun 25 jQuery
jquery一键控制checkbox全选、反选或全不选
Oct 16 jQuery
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
Dec 10 jQuery
jQuery实现的自定义轮播图功能详解
Dec 28 jQuery
JQuery Ajax跨域调用和非跨域调用问题实例分析
Apr 16 jQuery
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
jQuery轮播图功能制作方法详解
Dec 03 jQuery
jquery实现进度条状态展示
Mar 26 jQuery
jQuery弹框插件使用方法详解
May 26 jQuery
jQuery 实现扁平式小清新导航
Jul 07 jQuery
jQuery图片加载失败替换默认图片方法汇总
Nov 29 #jQuery
jquery animate动画持续运动的实例
Nov 29 #jQuery
JQuery 又谈ajax局部刷新
Nov 27 #jQuery
jQuery Datatables表头不对齐的解决办法
Nov 27 #jQuery
javaScript和jQuery自动加载简单代码实现方法
Nov 24 #jQuery
jquery实现回车键触发事件(实例讲解)
Nov 21 #jQuery
jQuery实现所有验证通过方可提交的表单验证
Nov 21 #jQuery
You might like
php 特殊字符处理函数
2008/09/05 PHP
php 过滤危险html代码
2009/06/29 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
理解Javascript闭包
2013/11/01 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
Python实现直播推流效果
2019/11/26 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
使用python实现学生信息管理系统
2021/02/25 Python
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
幼师自荐信范文
2013/10/06 职场文书
自我评价的写作规则
2014/01/06 职场文书
小学庆六一活动方案
2014/02/28 职场文书
贷款承诺书范文
2014/05/19 职场文书
药剂专业自荐书
2014/06/20 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android