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插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
Mar 22 jQuery
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
jquery submit()不能提交表单的解决方法
Apr 24 jQuery
jQuery动态追加页面数据以及事件委托详解
May 06 jQuery
jQuery中clone()函数实现表单中增加和减少输入项
May 13 jQuery
jQuery.Form实现Ajax上传文件同时设置headers的方法
Jun 26 jQuery
jQuery列表检索功能实现代码
Jul 17 jQuery
详解jQuery中关于Ajax的几个常用的函数
Jul 17 jQuery
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
Jan 25 jQuery
jQuery实现表格的增、删、改操作示例
Jan 27 jQuery
使用jQuery如何写一个含验证码的登录界面
May 13 jQuery
高效jQuery选择器的5个技巧实例分析
Nov 26 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使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
Firefox div高度自适应
2009/04/28 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
python实现简单购物商城
2016/05/21 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
Python如何发布程序的详细教程
2018/10/09 Python
Django中的forms组件实例详解
2018/11/08 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
python:接口间数据传递与调用方法
2018/12/17 Python
详解python statistics模块及函数用法
2019/10/27 Python
Python算法中的时间复杂度问题
2019/11/19 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
幼儿教师师德承诺书
2014/05/23 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
大学生个人求职信例文
2014/07/07 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
紫日观后感
2015/06/05 职场文书
长征观后感
2015/06/09 职场文书
2015党建工作简报
2015/07/21 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers