ztree 后台异步加载_使用zTree异步加载(详细教程)

本文介绍了在使用jQuery zTree插件时遇到的异步加载添加子节点重复的问题及其解决方案。作者分析了问题产生的原因,并提供了两种优化的处理方式,包括检查父节点是否已展开以及利用zTree的zAsync属性来决定是否需要重新加载子节点。这两种方法都有效地避免了子节点的重复添加,提高了用户体验。
摘要由CSDN通过智能技术生成

zTree 是一个依靠 jQuery 实现的多功能 “树插件”。下面通过本文给大家分享jQuery zTree 异步加载添加子节点重复问题,需要的朋友参考下吧

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");

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值