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 相关文章推荐
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
Jun 01 jQuery
jquery仿京东商品放大浏览页面
Jun 06 jQuery
React中jquery引用的实现方法
Sep 12 jQuery
jQuery实现动态添加节点与遍历节点功能示例
Nov 09 jQuery
webpack写jquery插件的环境配置
Dec 21 jQuery
jQuery实现标签子元素的添加和赋值方法
Feb 24 jQuery
JS文件中加载jquery.js的实例代码
May 05 jQuery
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
详解jQuery中的getAll()和cleanData()
Apr 15 jQuery
jQuery实现的记住帐号密码功能完整示例
Aug 03 jQuery
jquery将信息遍历到界面上实例代码
Jan 21 jQuery
使用jquery实现轮播图效果
Jan 02 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/01/10 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
常用js脚本
2006/12/03 Javascript
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
Python 随机生成中文验证码的实例代码
2013/03/20 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
基于Python实现定时自动给微信好友发送天气预报
2018/10/25 Python
python函数的万能参数传参详解
2019/07/26 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
安全生产月演讲稿
2014/05/09 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
公司庆典欢迎词
2015/01/26 职场文书