这篇记录是对第一篇“visjs--network展开和折叠节点的思路”的第一个实现版本,“也是参考了网上的一vis文章修改后的,非常感谢该作者提供的思路,因为网上各种转载,不知道原版作者是谁,如果作者看到请留言,我会将原贴地址发出来,谢谢!”,但是展开和折叠节点的在多于200个节点后,会出现明显的延迟,所以才有了第二个优化的版本,这里仅仅只是放出来给自己做个案例参考,如果有幸被看到,需要该demo的,可以留下邮箱,这里篇幅原因,不放出全部demo,仅仅也只是片段。
展开和收缩下级所有节点
function remove_sub_nodes(node_id, obj) {
var sub_nodes = get_directly_sub_nodes(node_id, obj);
if (sub_nodes.length == 0) {
if (typeof (obj.subids) != 'undefined') {
$.each(obj.subids, function (index, item) {
nodes.add(newNodeArr[item]);
edges.add({id: node_id + '_' + item, from: node_id, to: item});
remove_all_sub_nodes(item, newNodeArr[item]);
network.moveNode(item,nodes._data[item].x,nodes._data[item].y);
});
} else {
//alert('当前为叶子节点');
}
} else {
$.each(sub_nodes, function (index, item) {
var sub_sub_nodes = get_directly_sub_nodes(item, newNodeArr[item]);
if (sub_sub_nodes.length == 0) {
nodes.remove({id: item});
edges.remove({id: node_id + '_' + item});
} else {
remove_all_sub_nodes(item, newNodeArr[item])
}
nodes.remove({id: item});
edges.remove({id: node_id + '_' + item});
});
}
}
获取子节点的信息
function get_directly_sub_nodes(node_id, obj) {
var return_nodes = [];
var connectedNodes = network.getConnectedNodes(node_id);//获取所有连接节点
$.each(connectedNodes, function (index, item) {
if (item != obj.pid) {//当前节点的父节点 ,不操作
return_nodes.push(item);
}
});
return return_nodes;
}
简单说明
1. remove_sub_nodes(node_id, obj):
node_id:表示点击的节点的id值
obj:表示点击的节点对象
2. get_directly_sub_nodes(node_id, obj):
node_id:表示点击的节点的id值
obj:表示点击的节点对象
以上两个函数思路就是,点击节点,判断节点下是否存在子节点,然后将子节点循环添加或者删除达到展开和折叠的效果。