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实现放大镜简洁代码(推荐)
Jun 08 jQuery
基于jQuery封装的分页组件
Jun 26 jQuery
利用jQuery异步上传文件的插件用法详解
Jul 19 jQuery
jQuery.Ajax()的data参数类型详解
Jul 23 jQuery
关于JS与jQuery中的文档加载问题
Aug 22 jQuery
jQuery 1.9版本以上的浏览器判断方法代码分享
Aug 28 jQuery
jQuery实现的简单动态添加、删除表格功能示例
Sep 21 jQuery
jQuery实现表单动态添加与删除数据操作示例
Jul 03 jQuery
浅谈JS和jQuery的区别
Mar 27 jQuery
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 jQuery
jQuery Migrate 插件用法实例详解
May 22 jQuery
jQuery zTree如何改变指定节点文本样式
Oct 16 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
php的大小写敏感问题整理
2011/12/29 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
js window.onload 加载多个函数的方法
2009/11/02 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
python决策树之C4.5算法详解
2017/12/20 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
python redis存入字典序列化存储教程
2020/07/16 Python
python 常见的排序算法实现汇总
2020/08/21 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
自考生自我评价分享
2014/01/18 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
党在我心中演讲稿
2014/09/02 职场文书
大学生个人总结范文
2015/02/15 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
盲山观后感
2015/06/11 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书