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中的deferred使用方法
Mar 27 jQuery
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
JS/jquery实现一个网页内同时调用多个倒计时的方法
Apr 27 jQuery
jquery.masonry瀑布流效果
May 25 jQuery
jQuery接受后台传递的List的实例详解
Aug 02 jQuery
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
Aug 23 jQuery
解决IE7中使用jQuery动态操作name问题
Aug 28 jQuery
jQuery实现对网页节点的增删改查功能示例
Sep 18 jQuery
一个有意思的鼠标点击文字特效jquery代码
Sep 23 jQuery
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 jQuery
jquery实现上传图片功能
Jun 29 jQuery
JS+JQuery实现无缝连接轮播图
Dec 30 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函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
Python3最长回文子串算法示例
2019/03/04 Python
Django密码系统实现过程详解
2019/07/19 Python
python中有帮助函数吗
2020/06/19 Python
大学活动总结格式
2014/04/29 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
高中教师个人总结
2015/02/10 职场文书
市场部岗位职责范本
2015/04/15 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
python百行代码实现汉服圈图片爬取
2021/11/23 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸